From dd43157e09b8b355c89f731df75a373be2ae5a2f Mon Sep 17 00:00:00 2001 From: XsX05 <3541908431@qq.com> Date: Tue, 2 Sep 2025 22:13:07 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E9=9A=8F=E6=9C=BA=E5=8F=91=E7=97=85?= =?UTF-8?q?=EF=BC=8C=E8=BF=90=E5=8A=BF=EF=BC=8C=E5=86=B7=E7=AC=91=E8=AF=9D?= =?UTF-8?q?=EF=BC=8C=E6=AE=B5=E5=AD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../娱乐消遣/随机冷笑话/css/Untitled-1.html | 16 + .../娱乐消遣/随机冷笑话/css/background.css | 107 ++++++ .../60sapi/娱乐消遣/随机冷笑话/css/style.css | 217 +++++++++++ .../60sapi/娱乐消遣/随机冷笑话/index.html | 58 +++ .../60sapi/娱乐消遣/随机冷笑话/js/script.js | 117 ++++++ .../60sapi/娱乐消遣/随机冷笑话/接口集合.json | 47 +++ .../60sapi/娱乐消遣/随机冷笑话/返回接口.json | 8 + .../娱乐消遣/随机发病文学/css/background.css | 90 +++++ .../娱乐消遣/随机发病文学/css/style.css | 235 ++++++++++++ .../60sapi/娱乐消遣/随机发病文学/index.html | 34 ++ .../60sapi/娱乐消遣/随机发病文学/js/script.js | 147 ++++++++ .../娱乐消遣/随机发病文学/接口集合.json | 47 +++ .../娱乐消遣/随机发病文学/返回接口.json | 8 + .../娱乐消遣/随机搞笑段子/css/background.css | 36 ++ .../娱乐消遣/随机搞笑段子/css/style.css | 199 ++++++++++ .../60sapi/娱乐消遣/随机搞笑段子/index.html | 59 +++ .../60sapi/娱乐消遣/随机搞笑段子/js/script.js | 122 +++++++ .../娱乐消遣/随机搞笑段子/接口集合.json | 47 +++ .../娱乐消遣/随机搞笑段子/返回接口.json | 8 + .../娱乐消遣/随机运势/css/background.css | 26 ++ .../60sapi/娱乐消遣/随机运势/css/style.css | 342 ++++++++++++++++++ frontend/60sapi/娱乐消遣/随机运势/index.html | 71 ++++ .../60sapi/娱乐消遣/随机运势/js/script.js | 175 +++++++++ .../60sapi/娱乐消遣/随机运势/接口集合.json | 7 + .../60sapi/娱乐消遣/随机运势/返回接口.json | 10 + 25 files changed, 2233 insertions(+) create mode 100644 frontend/60sapi/娱乐消遣/随机冷笑话/css/Untitled-1.html create mode 100644 frontend/60sapi/娱乐消遣/随机冷笑话/css/background.css create mode 100644 frontend/60sapi/娱乐消遣/随机冷笑话/css/style.css create mode 100644 frontend/60sapi/娱乐消遣/随机冷笑话/index.html create mode 100644 frontend/60sapi/娱乐消遣/随机冷笑话/js/script.js create mode 100644 frontend/60sapi/娱乐消遣/随机冷笑话/接口集合.json create mode 100644 frontend/60sapi/娱乐消遣/随机冷笑话/返回接口.json create mode 100644 frontend/60sapi/娱乐消遣/随机发病文学/css/background.css create mode 100644 frontend/60sapi/娱乐消遣/随机发病文学/css/style.css create mode 100644 frontend/60sapi/娱乐消遣/随机发病文学/index.html create mode 100644 frontend/60sapi/娱乐消遣/随机发病文学/js/script.js create mode 100644 frontend/60sapi/娱乐消遣/随机发病文学/接口集合.json create mode 100644 frontend/60sapi/娱乐消遣/随机发病文学/返回接口.json create mode 100644 frontend/60sapi/娱乐消遣/随机搞笑段子/css/background.css create mode 100644 frontend/60sapi/娱乐消遣/随机搞笑段子/css/style.css create mode 100644 frontend/60sapi/娱乐消遣/随机搞笑段子/index.html create mode 100644 frontend/60sapi/娱乐消遣/随机搞笑段子/js/script.js create mode 100644 frontend/60sapi/娱乐消遣/随机搞笑段子/接口集合.json create mode 100644 frontend/60sapi/娱乐消遣/随机搞笑段子/返回接口.json create mode 100644 frontend/60sapi/娱乐消遣/随机运势/css/background.css create mode 100644 frontend/60sapi/娱乐消遣/随机运势/css/style.css create mode 100644 frontend/60sapi/娱乐消遣/随机运势/index.html create mode 100644 frontend/60sapi/娱乐消遣/随机运势/js/script.js create mode 100644 frontend/60sapi/娱乐消遣/随机运势/接口集合.json create mode 100644 frontend/60sapi/娱乐消遣/随机运势/返回接口.json diff --git a/frontend/60sapi/娱乐消遣/随机冷笑话/css/Untitled-1.html b/frontend/60sapi/娱乐消遣/随机冷笑话/css/Untitled-1.html new file mode 100644 index 00000000..6edd77e5 --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机冷笑话/css/Untitled-1.html @@ -0,0 +1,16 @@ + + + + + + 每日笑话 + + + +
+

加载中...

+ +
+ + + \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机冷笑话/css/background.css b/frontend/60sapi/娱乐消遣/随机冷笑话/css/background.css new file mode 100644 index 00000000..79480464 --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机冷笑话/css/background.css @@ -0,0 +1,107 @@ +/* background.css - 动态渐变背景 */ +body { + background: linear-gradient(-45deg, #ee7752, #e73c7e, #23a6d5, #23d5ab); + background-size: 400% 400%; + animation: gradient 15s ease infinite; +} + +@keyframes gradient { + 0% { + background-position: 0% 50%; + } + 50% { + background-position: 100% 50%; + } + 100% { + background-position: 0% 50%; + } +} +:root { + --bg-yellow: #FFFDE7; /* 浅黄 */ + --bg-blue: #E3F2FD; /* 淡蓝 */ +} + +body { + background: linear-gradient(180deg, var(--bg-yellow) 0%, var(--bg-blue) 100%); + background-attachment: fixed; /* 固定背景,滚动时不移动 */ +} + +body { + margin: 0; + padding: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; + overflow: hidden; + transition: background-color 0.5s ease; +} + +/* Light Theme (Default) */ +[data-theme="light"] { + background: linear-gradient(to bottom, #87CEEB, #B0E0E6); +} + +/* Dark Theme */ +[data-theme="dark"] { + background: linear-gradient(to bottom, #232526, #414345); +} +[data-theme="dark"] .snowflake { + color: #999; +} + +/* Winter Theme */ +[data-theme="winter"] { + background: linear-gradient(to bottom, #a1c4fd, #c2e9fb); +} +[data-theme="winter"] .background-bottom { + position: fixed; + bottom: 0; + left: 0; + width: 100%; + height: 100px; + background: linear-gradient(to top, white, rgba(255, 255, 255, 0)); + z-index: -1; + border-radius: 50% 50% 0 0 / 20px; + box-shadow: 0 -10px 20px rgba(255, 255, 255, 0.5); +} + + +#snowflake-container { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + pointer-events: none; + z-index: 0; +} + +.snowflake { + position: absolute; + top: -10%; + color: white; + font-size: 20px; + user-select: none; + animation: fall linear infinite; +} + +@keyframes fall { + to { + transform: translateY(105vh) rotate(360deg); + } +} + +#frost-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: url('https://www.transparenttextures.com/patterns/ice-age.png') repeat; + opacity: 0; + pointer-events: none; + transition: opacity 0.5s ease-in-out; + z-index: 100; +} + +#frost-overlay.is-frosted { + opacity: 0.3; +} \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机冷笑话/css/style.css b/frontend/60sapi/娱乐消遣/随机冷笑话/css/style.css new file mode 100644 index 00000000..1676dffd --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机冷笑话/css/style.css @@ -0,0 +1,217 @@ +:root { + --primary-color-light: #4A90E2; + --text-color-light: #333; + --card-bg-light: rgba(255, 255, 255, 0.85); + + --primary-color-dark: #5271C4; + --text-color-dark: #E0E0E0; + --card-bg-dark: rgba(40, 40, 40, 0.85); + + --primary-color-winter: #6A82FB; + --text-color-winter: #2c3e50; + --card-bg-winter: rgba(255, 255, 255, 0.7); +} + +.container { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + min-height: 100vh; + padding: 20px; + box-sizing: border-box; + text-align: center; + position: relative; + z-index: 1; +} + +.top-nav { + position: absolute; + top: 20px; + right: 20px; + background: rgba(255, 255, 255, 0.3); + padding: 5px; + border-radius: 50px; + backdrop-filter: blur(5px); +} + +.theme-switcher { + display: flex; + gap: 5px; +} + +.theme-btn { + background: transparent; + border: 2px solid transparent; + border-radius: 50%; + width: 40px; + height: 40px; + font-size: 1.5em; + cursor: pointer; + transition: transform 0.2s, border-color 0.2s; +} +.theme-btn:hover { + transform: scale(1.1); +} +.theme-btn.active { + border-color: white; +} + +.title { + font-family: 'ZCOOL KuaiLe', cursive; + font-size: 3em; + margin-bottom: 20px; + transition: color 0.5s ease; +} + +.joke-stream { + width: 100%; + max-width: 500px; + display: flex; + flex-direction: column; + gap: 25px; +} + +.joke-card { + border-radius: 20px; + padding: 30px 40px; + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.15); + width: 100%; + max-width: 500px; + min-height: 150px; + display: flex; + justify-content: center; + align-items: center; + position: relative; + backdrop-filter: blur(8px); + border: 1px solid rgba(255, 255, 255, 0.2); + transition: background-color 0.5s ease, border-color 0.5s ease; +} + +#joke-text { + font-size: 1.5em; + line-height: 1.6; + transition: opacity 0.3s, color 0.5s ease; +} + +/* --- Theming --- */ + +/* Light Theme */ +[data-theme="light"] .title { color: white; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.2); } +[data-theme="light"] .joke-card { background-color: var(--card-bg-light); } +[data-theme="light"] #joke-text { color: var(--text-color-light); } +[data-theme="light"] #new-joke-btn { background-color: var(--primary-color-light); box-shadow: 0 4px 15px rgba(74, 144, 226, 0.4); } +[data-theme="light"] footer { color: rgba(255, 255, 255, 0.8); } + +/* Dark Theme */ +[data-theme="dark"] .title { color: #EAEAEA; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5); } +[data-theme="dark"] .joke-card { background-color: var(--card-bg-dark); border-color: rgba(255, 255, 255, 0.1); } +[data-theme="dark"] #joke-text { color: var(--text-color-dark); } +[data-theme="dark"] #new-joke-btn { background-color: var(--primary-color-dark); box-shadow: 0 4px 15px rgba(82, 113, 196, 0.4); } +[data-theme="dark"] footer { color: rgba(200, 200, 200, 0.7); } + +/* Winter Theme */ +[data-theme="winter"] .title { color: #1e3a5f; text-shadow: 1px 1px 2px rgba(255, 255, 255, 0.7); } +[data-theme="winter"] .joke-card { + background-color: var(--card-bg-winter); + border-color: rgba(255, 255, 255, 0.8); + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1), inset 0 0 15px rgba(255, 255, 255, 0.5); +} +[data-theme="winter"] #joke-text { color: var(--text-color-winter); } +[data-theme="winter"] #new-joke-btn { background-color: var(--primary-color-winter); box-shadow: 0 4px 15px rgba(106, 130, 251, 0.4); } +[data-theme="winter"] footer { color: #1e3a5f; } + + +.controls { + margin-top: 30px; +} + +#new-joke-btn { + color: white; + font-size: 1.2em; + font-weight: bold; + padding: 15px 35px; + border: none; + border-radius: 50px; + cursor: pointer; + transition: transform 0.2s ease, box-shadow 0.2s ease, background-color 0.5s ease; +} + +#new-joke-btn:hover { + transform: translateY(-3px); +} + +#new-joke-btn:active { + transform: translateY(1px); +} + +.interactions { + margin-top: 25px; + display: flex; + gap: 20px; +} + +.interaction-btn { + background: rgba(255, 255, 255, 0.7); + border: 1px solid rgba(255, 255, 255, 0.9); + border-radius: 50%; + width: 50px; + height: 50px; + font-size: 1.5em; + cursor: pointer; + transition: transform 0.2s, background-color 0.2s; +} + +.interaction-btn:hover { + transform: scale(1.1); + background: white; +} + +footer { + position: absolute; + bottom: 10px; + font-size: 0.9em; + transition: color 0.5s ease; +} + +/* Loader */ +#loader { + position: absolute; + transition: color 0.5s ease; +} +[data-theme="light"] #loader { color: var(--primary-color-light); } +[data-theme="dark"] #loader { color: var(--primary-color-dark); } +[data-theme="winter"] #loader { color: var(--primary-color-winter); } + +.snowflake-loader { + font-size: 40px; + display: inline-block; + animation: spin 1.5s linear infinite; +} +.snowflake-loader::before { + content: '❄'; +} +@keyframes spin { + to { transform: rotate(360deg); } +} + +.hidden { + display: none; +} + +/* Responsive */ +@media (max-width: 600px) { + .title { + font-size: 2.5em; + } + .joke-card { + padding: 25px; + } + #joke-text { + font-size: 1.2em; + } + .top-nav { + top: 10px; + right: 10px; + } +} \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机冷笑话/index.html b/frontend/60sapi/娱乐消遣/随机冷笑话/index.html new file mode 100644 index 00000000..68477bd1 --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机冷笑话/index.html @@ -0,0 +1,58 @@ + + + + + + 随机冷笑话 + + + + + +
+
+
+ + + +
+
+

冷笑话生成器

+
+ +
+ +

点击下面的按钮,来点冷笑话吧!

+
+ +
+ +
+ +
+ + + + +
+
+ + + + + + + + + \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机冷笑话/js/script.js b/frontend/60sapi/娱乐消遣/随机冷笑话/js/script.js new file mode 100644 index 00000000..8fe675eb --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机冷笑话/js/script.js @@ -0,0 +1,117 @@ +document.addEventListener('DOMContentLoaded', () => { + const jokeTextElem = document.getElementById('joke-text'); + const newJokeBtn = document.getElementById('new-joke-btn'); + const snowflakeContainer = document.getElementById('snowflake-container'); + const frostOverlay = document.getElementById('frost-overlay'); + const windSound = document.getElementById('wind-sound'); + const snowSound = document.getElementById('snow-sound'); + const loader = document.getElementById('loader'); + const themeBtns = document.querySelectorAll('.theme-btn'); + + const apiEndpoints = [ + 'https://60s.api.shumengya.top/v2/dad-joke', + ]; + let currentApiIndex = 0; + + async function fetchJoke() { + jokeTextElem.classList.add('hidden'); + loader.classList.remove('hidden'); + + try { + const response = await fetch(apiEndpoints[currentApiIndex]); + if (!response.ok) throw new Error('Network response was not ok'); + + const data = await response.json(); + if (data.code === 200 && data.data.content) { + updateJokeText(data.data.content); + if (document.body.dataset.theme === 'winter' && Math.random() < 0.3) { + triggerFrostEffect(); + } + } else { + throw new Error('API returned invalid data'); + } + } catch (error) { + console.error('Fetch error:', error); + currentApiIndex = (currentApiIndex + 1) % apiEndpoints.length; + if (currentApiIndex !== 0) { + fetchJoke(); + } else { + jokeTextElem.textContent = '冰箱坏了,暂时没有冷笑话...'; + } + } finally { + loader.classList.add('hidden'); + jokeTextElem.classList.remove('hidden'); + } + } + + function updateJokeText(text) { + jokeTextElem.textContent = ''; + let i = 0; + const typing = setInterval(() => { + if (i < text.length) { + jokeTextElem.textContent += text.charAt(i); + i++; + } else { + clearInterval(typing); + } + }, 50); + } + + function createSnowflakes() { + const snowflakeCount = document.body.dataset.theme === 'dark' ? 50 : 30; + snowflakeContainer.innerHTML = ''; + for (let i = 0; i < snowflakeCount; i++) { + const snowflake = document.createElement('div'); + snowflake.className = 'snowflake'; + snowflake.textContent = '❄️'; + + snowflake.style.left = `${Math.random() * 100}vw`; + snowflake.style.fontSize = `${Math.random() * 15 + 10}px`; + snowflake.style.opacity = Math.random() * 0.5 + 0.3; + + const duration = Math.random() * 10 + 8; + const delay = Math.random() * 10; + + snowflake.style.animation = `fall ${duration}s linear ${delay}s infinite`; + + snowflakeContainer.appendChild(snowflake); + } + } + + function triggerFrostEffect() { + frostOverlay.classList.add('is-frosted'); + windSound.play().catch(e => console.error("Audio play failed:", e)); + setTimeout(() => { + frostOverlay.classList.remove('is-frosted'); + }, 2000); + } + + function setTheme(theme) { + document.body.dataset.theme = theme; + localStorage.setItem('joke-theme', theme); + + themeBtns.forEach(btn => { + btn.classList.toggle('active', btn.dataset.themeTarget === theme); + }); + + if (theme === 'winter') { + snowSound.play().catch(e => console.error("Audio play failed:", e)); + } + + // Recreate snowflakes for theme-specific density + createSnowflakes(); + } + + themeBtns.forEach(btn => { + btn.addEventListener('click', () => { + setTheme(btn.dataset.themeTarget); + }); + }); + + newJokeBtn.addEventListener('click', fetchJoke); + + // Initial setup + const savedTheme = localStorage.getItem('joke-theme') || 'light'; + setTheme(savedTheme); + fetchJoke(); +}); \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机冷笑话/接口集合.json b/frontend/60sapi/娱乐消遣/随机冷笑话/接口集合.json new file mode 100644 index 00000000..90aa64a6 --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机冷笑话/接口集合.json @@ -0,0 +1,47 @@ +{ + "api_name": "60s-api", + "api_version": "2.22.1", + "api_docs": "https://docs.60s-api.viki.moe", + "author": "Viki ", + "user_group": "595941841", + "github_repo": "https://github.com/vikiboss/60s", + "updated": "2025/09/01 11:12:08", + "updated_at": 1756696328000, + "endpoints": [ + "/v2/60s", + "/v2/answer", + "/v2/baike", + "/v2/bili", + "/v2/bing", + "/v2/changya", + "/v2/chemical", + "/v2/douyin", + "/v2/duanzi", + "/v2/epic", + "/v2/exchange_rate", + "/v2/fabing", + "/v2/hitokoto", + "/v2/ip", + "/v2/kfc", + "/v2/luck", + "/v2/maoyan", + "/v2/today_in_history", + "/v2/toutiao", + "/v2/weibo", + "/v2/zhihu", + "/v2/lunar", + "/v2/ai-news", + "/v2/awesome-js", + "/v2/qrcode", + "/v2/dad-joke", + "/v2/hacker-news/:type", + "/v2/og", + "/v2/hash", + "/v2/fanyi", + "/v2/fanyi/langs", + "/v2/weather", + "/v2/weather/forecast", + "/v2/ncm-rank", + "/v2/ncm-rank/:id" + ] +} \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机冷笑话/返回接口.json b/frontend/60sapi/娱乐消遣/随机冷笑话/返回接口.json new file mode 100644 index 00000000..b514f650 --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机冷笑话/返回接口.json @@ -0,0 +1,8 @@ +{ + "code": 200, + "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", + "data": { + "index": 121, + "content": "这个世界上谁最懂猪?蜘蛛(知猪)人。" + } +} \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机发病文学/css/background.css b/frontend/60sapi/娱乐消遣/随机发病文学/css/background.css new file mode 100644 index 00000000..b77c1a35 --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机发病文学/css/background.css @@ -0,0 +1,90 @@ +body { + background-color: #1a1a1a; + color: #e0e0e0; + font-family: 'Courier New', Courier, monospace; + overflow: hidden; + margin: 0; + padding: 0; +} + +#bg-container { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: -2; + overflow: hidden; + transition: transform 0.2s ease-out; +} + +.floating-emoji { + position: absolute; + user-select: none; + opacity: 0; + animation-iteration-count: infinite; + animation-timing-function: linear; +} + +@keyframes float-top-to-bottom { + 0% { transform: translateY(-10vh) rotate(0deg); opacity: 0; } + 10%, 90% { opacity: 0.7; } + 100% { transform: translateY(110vh) rotate(360deg); opacity: 0; } +} + +@keyframes float-bottom-to-top { + 0% { transform: translateY(110vh) rotate(0deg); opacity: 0; } + 10%, 90% { opacity: 0.7; } + 100% { transform: translateY(-10vh) rotate(360deg); opacity: 0; } +} + +@keyframes float-left-to-right { + 0% { transform: translateX(-10vw) rotate(0deg); opacity: 0; } + 10%, 90% { opacity: 0.7; } + 100% { transform: translateX(110vw) rotate(360deg); opacity: 0; } +} + +@keyframes float-right-to-left { + 0% { transform: translateX(110vw) rotate(0deg); opacity: 0; } + 10%, 90% { opacity: 0.7; } + 100% { transform: translateX(-10vw) rotate(360deg); opacity: 0; } +} + +.text-fragment { + position: absolute; + font-size: 24px; + color: rgba(255, 0, 255, 0.4); + opacity: 0; + animation: float-fragment 15s linear infinite, fade-in-out 15s linear infinite; + user-select: none; +} + +@keyframes float-fragment { + 0% { transform: translate(0, 0) rotate(0deg); } + 25% { transform: translate(20px, 40px) rotate(15deg); } + 50% { transform: translate(-30px, -10px) rotate(-10deg); } + 75% { transform: translate(10px, -30px) rotate(5deg); } + 100% { transform: translate(0, 0) rotate(0deg); } +} + +@keyframes fade-in-out { + 0%, 100% { opacity: 0; } + 10%, 90% { opacity: 0.4; } +} + +.screen-crack { + position: absolute; + width: 200px; + height: 200px; + background-image: url('data:image/svg+xml;utf8,'); + opacity: 0; + animation: flicker-crack 25s steps(1, end) infinite; +} + +@keyframes flicker-crack { + 0%, 100% { opacity: 0; } + 50% { opacity: 0.3; } + 51% { opacity: 0; } + 75% { opacity: 0.2; } + 76% { opacity: 0; } +} \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机发病文学/css/style.css b/frontend/60sapi/娱乐消遣/随机发病文学/css/style.css new file mode 100644 index 00000000..db1df76c --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机发病文学/css/style.css @@ -0,0 +1,235 @@ +.container { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + min-height: 100vh; + padding: 20px; + box-sizing: border-box; + position: relative; + z-index: 1; +} + +.content-card { + background: rgba(20, 20, 20, 0.7); + border: none; + padding: 40px; + max-width: 600px; + width: 100%; + text-align: center; + backdrop-filter: blur(5px); + position: relative; + clip-path: polygon(2% 5%, 97% 0%, 100% 95%, 0% 100%); +} + +.body-animated .content-card { + animation: tremble 0.4s infinite, glitch-shadow 1.5s steps(1, end) infinite; +} + +@keyframes tremble { + 0% { clip-path: polygon(2% 5%, 97% 0%, 100% 95%, 0% 100%); } + 25% { clip-path: polygon(2% 5%, 98% 2%, 99% 100%, 1% 98%); } + 50% { clip-path: polygon(3% 4%, 96% 1%, 100% 96%, 2% 100%); } + 75% { clip-path: polygon(1% 6%, 97% 3%, 98% 95%, 0% 99%); } + 100% { clip-path: polygon(2% 5%, 97% 0%, 100% 95%, 0% 100%); } +} + +@keyframes glitch-shadow { + 0% { + box-shadow: + 0 0 8px rgba(255, 0, 255, 0.5), + inset 0 0 8px rgba(255, 0, 255, 0.4); + } + 33% { + box-shadow: + 0 0 8px rgba(0, 255, 255, 0.5), + inset 0 0 8px rgba(0, 255, 255, 0.4); + } + 66% { + box-shadow: + 0 0 8px rgba(0, 255, 0, 0.5), + inset 0 0 8px rgba(0, 255, 0, 0.4); + } + 100% { + box-shadow: + 0 0 8px rgba(255, 0, 255, 0.5), + inset 0 0 8px rgba(255, 0, 255, 0.4); + } +} + +#literature-text { + font-size: 1.2em; + line-height: 1.8; + min-height: 100px; + color: #e0e0e0; + text-shadow: 0 0 5px rgba(0, 255, 135, 0.5); + animation: text-flicker 15s linear infinite; +} + +.body-animated #literature-text { + animation: text-flicker 15s linear infinite, text-shadow-glitch 2s steps(1, end) infinite; +} + +@keyframes text-flicker { + 0%, 100% { opacity: 1; } + 50.0% { opacity: 0.95; } + 50.5% { opacity: 1; } +} + +@keyframes text-shadow-glitch { + 0% { + text-shadow: + 1px 0 0 rgba(255,0,255,0.5), + -1px 0 0 rgba(0,255,255,0.5); + } + 10% { + text-shadow: + -1px 0 0 rgba(255,0,255,0.5), + 1px 0 0 rgba(0,255,255,0.5); + } + 11%, 100% { + text-shadow: none; + } +} + +.controls { + margin-top: 30px; + display: flex; + align-items: center; + gap: 20px; +} + +#new-literature-btn { + background-color: #ff00ff; + color: #fff; + border: none; + padding: 12px 25px; + font-size: 1em; + cursor: pointer; + border-radius: 5px; + text-transform: uppercase; + font-weight: bold; + transition: transform 0.2s, box-shadow 0.2s; + box-shadow: 0 0 10px #ff00ff, 0 0 20px #ff00ff; +} + +#new-literature-btn:hover { + transform: scale(1.05); + box-shadow: 0 0 15px #ff00ff, 0 0 30px #ff00ff; +} + +#new-literature-btn:active { + transform: scale(0.95); +} + +/* Animation Toggle Switch */ +.switch-container { + display: flex; + align-items: center; + gap: 10px; + color: #aaa; +} + +.switch { + position: relative; + display: inline-block; + width: 50px; + height: 24px; +} + +.switch input { + opacity: 0; + width: 0; + height: 0; +} + +.slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: #ccc; + transition: .4s; +} + +.slider:before { + position: absolute; + content: ""; + height: 16px; + width: 16px; + left: 4px; + bottom: 4px; + background-color: white; + transition: .4s; +} + +input:checked + .slider { + background-color: #ff00ff; +} + +input:checked + .slider:before { + transform: translateX(26px); +} + +.slider.round { + border-radius: 34px; +} + +.slider.round:before { + border-radius: 50%; +} + +/* Glitch Overlay & Animations */ +#glitch-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: -1; + pointer-events: none; +} + +.body-animated #glitch-overlay { + animation: color-shift 15s steps(1, end) infinite; +} + +@keyframes color-shift { + 0%, 100% { background: transparent; } + 10% { background: rgba(255, 0, 0, 0.05); } + 10.1% { background: transparent; } + 20% { background: rgba(0, 255, 0, 0.05); } + 20.1% { background: transparent; } + 30% { background: rgba(0, 0, 255, 0.05); } + 30.1% { background: transparent; } +} + +.flicker-block { + position: absolute; + background: rgba(255, 255, 255, 0.1); + opacity: 0; +} + +.body-animated .flicker-block { + animation: flicker 3s infinite; +} + +@keyframes flicker { + 0%, 100% { opacity: 0; } + 50% { opacity: 1; } +} + +/* Responsive Design */ +@media (max-width: 768px) { + .content-card { + padding: 20px; + } + #literature-text { + font-size: 1em; + } + .controls { + flex-direction: column; + } +} \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机发病文学/index.html b/frontend/60sapi/娱乐消遣/随机发病文学/index.html new file mode 100644 index 00000000..5af98657 --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机发病文学/index.html @@ -0,0 +1,34 @@ + + + + + + 随机发病文学 + + + + +
+
+
+ +
+
+

正在加载发病文学...

+
+ +
+ +
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机发病文学/js/script.js b/frontend/60sapi/娱乐消遣/随机发病文学/js/script.js new file mode 100644 index 00000000..f4901b06 --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机发病文学/js/script.js @@ -0,0 +1,147 @@ +document.addEventListener('DOMContentLoaded', () => { + const literatureTextElem = document.getElementById('literature-text'); + const newLiteratureBtn = document.getElementById('new-literature-btn'); + const animationToggle = document.getElementById('animation-toggle'); + const bgContainer = document.getElementById('bg-container'); + const body = document.body; + + const apiEndpoints = [ + 'https://60s.api.shumengya.top/v2/fabing', + // Add fallback APIs here if available + ]; + + let currentApiIndex = 0; + + async function fetchLiterature() { + literatureTextElem.textContent = '正在卖力发疯中...'; + literatureTextElem.style.opacity = '0.5'; + + try { + const response = await fetch(apiEndpoints[currentApiIndex]); + if (!response.ok) { + throw new Error('Network response was not ok'); + } + const data = await response.json(); + if (data.code === 200) { + literatureTextElem.textContent = data.data.saying; + } else { + throw new Error('API returned an error'); + } + } catch (error) { + console.error('Fetch error:', error); + currentApiIndex = (currentApiIndex + 1) % apiEndpoints.length; + if (currentApiIndex !== 0) { + fetchLiterature(); // Retry with the next API + } else { + literatureTextElem.textContent = '疯不起来了,请稍后再试。'; + } + } finally { + literatureTextElem.style.opacity = '1'; + } + } + + function createFloatingEmojis() { + const existingEmojis = bgContainer.querySelectorAll('.floating-emoji'); + existingEmojis.forEach(e => e.remove()); + + const emojis = ['🤯', '😵', '🤪', '🥴', '🤡', '👹', '👻', '💀', '💥', '🔥', '🌪️', '😵‍💫']; + const animationNames = ['float-top-to-bottom', 'float-bottom-to-top', 'float-left-to-right', 'float-right-to-left']; + const emojiCount = 25; + + for (let i = 0; i < emojiCount; i++) { + const emojiEl = document.createElement('div'); + emojiEl.className = 'floating-emoji'; + emojiEl.textContent = emojis[Math.floor(Math.random() * emojis.length)]; + + const animationName = animationNames[Math.floor(Math.random() * animationNames.length)]; + emojiEl.style.animationName = animationName; + emojiEl.style.animationDuration = `${Math.random() * 10 + 15}s`; // 15-25 seconds + emojiEl.style.animationDelay = `${Math.random() * 20}s`; + emojiEl.style.fontSize = `${Math.random() * 20 + 20}px`; + + // Set initial position based on animation direction + if (animationName.includes('top') || animationName.includes('bottom')) { // Vertical movement + emojiEl.style.left = `${Math.random() * 100}vw`; + } else { // Horizontal movement + emojiEl.style.top = `${Math.random() * 100}vh`; + } + + bgContainer.appendChild(emojiEl); + } + } + + function createFragments() { + const existingFragments = bgContainer.querySelectorAll('.text-fragment'); + existingFragments.forEach(f => f.remove()); + + const fragments = ['我', '疯', '了', '?', '!', '…', '救命', '为什么', '好烦', '啊啊啊']; + for (let i = 0; i < 20; i++) { + const frag = document.createElement('div'); + frag.className = 'text-fragment'; + frag.textContent = fragments[Math.floor(Math.random() * fragments.length)]; + frag.style.top = `${Math.random() * 100}%`; + frag.style.left = `${Math.random() * 100}%`; + frag.style.animationDelay = `${Math.random() * 15}s`; + frag.style.fontSize = `${Math.random() * 12 + 12}px`; + bgContainer.appendChild(frag); + } + } + + function createCracks() { + for (let i = 0; i < 2; i++) { + const crack = document.createElement('div'); + crack.className = 'screen-crack'; + crack.style.top = `${Math.random() * 80}%`; + crack.style.left = `${Math.random() * 80}%`; + crack.style.transform = `rotate(${Math.random() * 360}deg)`; + crack.style.animationDelay = `${Math.random() * 25}s`; + bgContainer.appendChild(crack); + } + } + + function createFlickerBlocks() { + const glitchOverlay = document.getElementById('glitch-overlay'); + for (let i = 0; i < 3; i++) { + const block = document.createElement('div'); + block.className = 'flicker-block'; + block.style.width = `${Math.random() * 100 + 50}px`; + block.style.height = `${Math.random() * 100 + 50}px`; + block.style.top = `${Math.random() * 90}%`; + block.style.left = `${Math.random() * 90}%`; + block.style.animationDuration = `${Math.random() * 2 + 2}s`; + block.style.animationDelay = `${Math.random() * 3}s`; + glitchOverlay.appendChild(block); + } + } + + function toggleAnimations() { + if (animationToggle.checked) { + body.classList.add('body-animated'); + } else { + body.classList.remove('body-animated'); + } + } + + document.addEventListener('mousemove', (e) => { + if (!animationToggle.checked) return; + const x = (window.innerWidth / 2) - e.pageX; + const y = (window.innerHeight / 2) - e.pageY; + bgContainer.style.transform = `translateX(${x / 50}px) translateY(${y / 50}px)`; + }); + + newLiteratureBtn.addEventListener('click', fetchLiterature); + animationToggle.addEventListener('change', toggleAnimations); + + // Initial setup + createFloatingEmojis(); + createFragments(); + createCracks(); + createFlickerBlocks(); + toggleAnimations(); + fetchLiterature(); + + window.addEventListener('resize', () => { + createFloatingEmojis(); + createFragments(); + }); +}); \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机发病文学/接口集合.json b/frontend/60sapi/娱乐消遣/随机发病文学/接口集合.json new file mode 100644 index 00000000..90aa64a6 --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机发病文学/接口集合.json @@ -0,0 +1,47 @@ +{ + "api_name": "60s-api", + "api_version": "2.22.1", + "api_docs": "https://docs.60s-api.viki.moe", + "author": "Viki ", + "user_group": "595941841", + "github_repo": "https://github.com/vikiboss/60s", + "updated": "2025/09/01 11:12:08", + "updated_at": 1756696328000, + "endpoints": [ + "/v2/60s", + "/v2/answer", + "/v2/baike", + "/v2/bili", + "/v2/bing", + "/v2/changya", + "/v2/chemical", + "/v2/douyin", + "/v2/duanzi", + "/v2/epic", + "/v2/exchange_rate", + "/v2/fabing", + "/v2/hitokoto", + "/v2/ip", + "/v2/kfc", + "/v2/luck", + "/v2/maoyan", + "/v2/today_in_history", + "/v2/toutiao", + "/v2/weibo", + "/v2/zhihu", + "/v2/lunar", + "/v2/ai-news", + "/v2/awesome-js", + "/v2/qrcode", + "/v2/dad-joke", + "/v2/hacker-news/:type", + "/v2/og", + "/v2/hash", + "/v2/fanyi", + "/v2/fanyi/langs", + "/v2/weather", + "/v2/weather/forecast", + "/v2/ncm-rank", + "/v2/ncm-rank/:id" + ] +} \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机发病文学/返回接口.json b/frontend/60sapi/娱乐消遣/随机发病文学/返回接口.json new file mode 100644 index 00000000..4a6d180e --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机发病文学/返回接口.json @@ -0,0 +1,8 @@ +{ + "code": 200, + "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", + "data": { + "index": 347, + "duanzi": "我不想读书,主要是因为家里牛啊,猪啊羊啊都没人喂。" + } +} \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机搞笑段子/css/background.css b/frontend/60sapi/娱乐消遣/随机搞笑段子/css/background.css new file mode 100644 index 00000000..7f1aa01c --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机搞笑段子/css/background.css @@ -0,0 +1,36 @@ +body { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; + margin: 0; + min-height: 100vh; + overflow-x: hidden; + transition: background 0.5s ease; +} + +/* Hand-drawn Comic Theme Background - NEW VIBRANT VERSION */ +body.theme-comic { + background: linear-gradient(-45deg, #ff7e5f, #feb47b, #ffcc80, #ffecb3); + background-size: 400% 400%; + animation: gradientBG 15s ease infinite; +} + +@keyframes gradientBG { + 0% { + background-position: 0% 50%; + } + 50% { + background-position: 100% 50%; + } + 100% { + background-position: 0% 50%; + } +} + +/* Placeholder for Emoji Theme Background */ +body.theme-emoji { + background-color: #fffde7; +} + +/* Placeholder for Retro TV Theme Background */ +body.theme-retro { + background-color: #3d2b1f; +} \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机搞笑段子/css/style.css b/frontend/60sapi/娱乐消遣/随机搞笑段子/css/style.css new file mode 100644 index 00000000..5dccdee4 --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机搞笑段子/css/style.css @@ -0,0 +1,199 @@ +@import url('https://fonts.googleapis.com/css2?family=Zhi+Mang+Xing&display=swap'); + +/* --- General & Theme Switcher --- */ +.container { + max-width: 600px; + margin: 0 auto; + padding: 20px; + text-align: center; +} + +.theme-switcher { + position: fixed; + top: 15px; + right: 15px; + display: flex; + gap: 5px; + background: rgba(255, 255, 255, 0.8); + padding: 5px; + border-radius: 20px; + box-shadow: 0 2px 10px rgba(0,0,0,0.1); + z-index: 100; +} + +.theme-icon { + width: 30px; + height: 30px; + border-radius: 50%; + display: flex; + justify-content: center; + align-items: center; + cursor: pointer; + transition: all 0.2s ease; + border: 2px solid transparent; +} +.theme-icon.active { + border-color: #ff7043; + transform: scale(1.1); +} + +/* --- Comic Theme Styles --- */ +.theme-comic header h1 { + font-family: 'Zhi Mang Xing', cursive; + font-size: 4em; + color: #d84315; /* Deep Orange */ + text-shadow: 2px 2px 0 #fff; + margin: 0.2em 0; +} + +.theme-comic .divider { + height: 3px; + background: linear-gradient(90deg, #ffca28, #ff7043, #29b6f6, #66bb6a); + border-radius: 3px; + margin: 20px auto; + width: 80%; +} + +.theme-comic .joke-card { + background: rgba(255, 255, 255, 0.85); /* White with transparency */ + backdrop-filter: blur(5px); + border-radius: 15px; + padding: 40px; + min-height: 200px; + box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15); + display: flex; + justify-content: center; + align-items: center; + position: relative; + margin-bottom: 20px; + transform: rotate(-1deg); + transition: transform 0.2s ease; +} +.theme-comic .joke-card:hover { + transform: rotate(1deg) scale(1.02); +} + +.theme-comic .joke-text { + font-family: 'Zhi Mang Xing', cursive; + font-size: 2em; + line-height: 1.6; + color: #5d4037; +} + +.theme-comic .new-joke-btn { + background: #1e88e5; /* Vibrant Blue */ + color: white; + font-family: 'Zhi Mang Xing', cursive; + font-size: 2.5em; + border: none; + border-radius: 50px; + padding: 10px 30px; + cursor: pointer; + box-shadow: 0 5px 0 #1565c0; /* Darker Blue */ + transition: all 0.1s ease-in-out; +} +.theme-comic .new-joke-btn:active { + transform: translateY(5px); + box-shadow: none; +} + +/* --- Loading Animation --- */ +.loading-container { display: none; } +.loading-container.visible { display: block; } +.loading-anim { + height: 60px; + width: 80px; + margin: 0 auto 10px; +} +.book { + transform-style: preserve-3d; + transform: rotateY(-30deg); + animation: flip 3s infinite; +} +.book, .book-page { + width: 40px; + height: 55px; + position: absolute; + left: 50%; + top: 50%; + margin-left: -20px; + margin-top: -27.5px; +} +.book-page { + background: #ffca28; + border: 1px solid #ff7043; + border-radius: 3px; + transform-origin: left; +} +.book-page:nth-child(1) { animation: flip-page 3s infinite; } +.book-page:nth-child(2) { animation: flip-page 3s -1s infinite; } +.book-page:nth-child(3) { animation: flip-page 3s -2s infinite; } + +@keyframes flip { 50% { transform: rotateY(30deg); } } +@keyframes flip-page { 30%, 100% { transform: rotateY(180deg); } } + +/* --- Feedback Buttons & Animations --- */ +.feedback-buttons { + display: flex; + justify-content: center; + gap: 15px; + margin-bottom: 30px; +} +.feedback-btn { + background: none; + border: none; + font-size: 2em; + cursor: pointer; + transition: transform 0.2s ease; +} +.feedback-btn:hover { transform: scale(1.2); } + +#animation-container { + position: fixed; + top: 0; left: 0; width: 100%; height: 100%; + pointer-events: none; z-index: 999; +} +.confetti, .snowflake { + position: absolute; + animation-timing-function: linear; + animation-iteration-count: infinite; +} +.confetti { + width: 10px; height: 10px; + animation-name: fall; +} +.snowflake { + font-size: 20px; color: #fff; + animation-name: fall; +} +@keyframes fall { + from { transform: translateY(-10vh) rotate(0deg); } + to { transform: translateY(110vh) rotate(360deg); } +} + +.joke-card.absurd { + animation: absurd-flash 0.5s 2; +} +@keyframes absurd-flash { + 0%, 100% { border: 2px solid transparent; } + 50% { border: 5px solid red; } +} + +/* --- General Joke Text Visibility --- */ +.joke-text { + opacity: 0; + transform: scale(0.9); + transition: opacity 0.4s ease, transform 0.4s ease; +} +.joke-text.visible { + opacity: 1; + transform: scale(1); +} + +/* --- Responsive --- */ +@media (max-width: 600px) { + .theme-comic header h1 { font-size: 3em; } + .theme-comic .joke-card { padding: 25px; transform: rotate(0); } + .theme-comic .joke-card:hover { transform: rotate(0); } + .theme-comic .joke-text { font-size: 1.5em; } +} \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机搞笑段子/index.html b/frontend/60sapi/娱乐消遣/随机搞笑段子/index.html new file mode 100644 index 00000000..e443b252 --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机搞笑段子/index.html @@ -0,0 +1,59 @@ + + + + + + 段子游乐场 + + + + + +
+
✏️
+
😂
+
📺
+
+ +
+
+

段子游乐场

+
+
+ +
+
+
+
+
+
+
+
+
+
+

段子菌正在翻笑话库...

+
+

+
+ + + + +
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机搞笑段子/js/script.js b/frontend/60sapi/娱乐消遣/随机搞笑段子/js/script.js new file mode 100644 index 00000000..2cb2eb32 --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机搞笑段子/js/script.js @@ -0,0 +1,122 @@ +document.addEventListener('DOMContentLoaded', () => { + // Elements + const body = document.body; + const jokeTextElem = document.getElementById('joke-text'); + const newJokeBtn = document.getElementById('new-joke-btn'); + const loadingContainer = document.querySelector('.loading-container'); + const animationContainer = document.getElementById('animation-container'); + const jokeCard = document.getElementById('joke-card'); + + // API + const apiBaseUrls = ["https://60s.api.shumengya.top", "https://60s-cf.viki.moe", "https://60s.viki.moe"]; + const apiPath = "/v2/duanzi"; + let currentApiIndex = 0; + + // --- Core Functions --- + const showLoading = (isLoading) => { + loadingContainer.classList.toggle('visible', isLoading); + if (isLoading) jokeTextElem.classList.remove('visible'); + }; + + const displayJoke = (joke) => { + jokeTextElem.textContent = joke; + showLoading(false); + setTimeout(() => jokeTextElem.classList.add('visible'), 50); + }; + + const fetchJoke = async () => { + showLoading(true); + try { + const url = apiBaseUrls[currentApiIndex] + apiPath; + const response = await fetch(url, { timeout: 5000 }); + if (!response.ok) throw new Error('Network response was not ok'); + + const data = await response.json(); + if (data.code === 200 && data.data && data.data.duanzi) { + displayJoke(data.data.duanzi); + } else { + throw new Error('Invalid data format'); + } + } catch (error) { + console.error(`API error with ${apiBaseUrls[currentApiIndex]}:`, error); + currentApiIndex = (currentApiIndex + 1) % apiBaseUrls.length; + if (currentApiIndex !== 0) { + fetchJoke(); // Try next API + } else { + displayJoke('段子菌迷路了!点击‘再来一个’让它重新找路~'); + } + } + }; + + // --- Theme Switcher --- + const themeSwitcher = document.querySelector('.theme-switcher'); + themeSwitcher.addEventListener('click', (e) => { + if (e.target.classList.contains('theme-icon')) { + const theme = e.target.dataset.theme; + body.className = theme; // Set body class to the selected theme + + // Update active icon + themeSwitcher.querySelectorAll('.theme-icon').forEach(icon => icon.classList.remove('active')); + e.target.classList.add('active'); + + alert(`主题已切换!部分主题(如表情包、复古电视)将在后续阶段实现。`); + } + }); + // Set initial active theme icon + themeSwitcher.querySelector(`[data-theme="${body.className}"]`).classList.add('active'); + + + // --- Feedback Buttons & Animations --- + const btnLol = document.getElementById('btn-lol'); + const btnCold = document.getElementById('btn-cold'); + const btnSeen = document.getElementById('btn-seen'); + const btnAbsurd = document.getElementById('btn-absurd'); + const soundLol = document.getElementById('sound-lol'); + const soundCold = document.getElementById('sound-cold'); + + btnLol.addEventListener('click', () => { + soundLol.play(); + createParticles(20, 'confetti'); + }); + + btnCold.addEventListener('click', () => { + soundCold.play(); + createParticles(15, 'snowflake'); + }); + + btnSeen.addEventListener('click', () => { + displayJoke("原来你也听过!那再给你换个新鲜的~"); + setTimeout(fetchJoke, 1500); + }); + + btnAbsurd.addEventListener('click', () => { + jokeCard.classList.add('absurd'); + setTimeout(() => jokeCard.classList.remove('absurd'), 1000); + }); + + function createParticles(count, type) { + animationContainer.innerHTML = ''; // Clear previous + const colors = ['#ffca28', '#ff7043', '#29b6f6', '#66bb6a']; + for (let i = 0; i < count; i++) { + const particle = document.createElement('div'); + particle.classList.add(type); + if (type === 'confetti') { + particle.style.backgroundColor = colors[Math.floor(Math.random() * colors.length)]; + } else { + particle.textContent = '❄️'; + } + particle.style.left = `${Math.random() * 100}vw`; + const duration = Math.random() * 3 + 2; // 2-5 seconds + const delay = Math.random() * -duration; // Start at different times + particle.style.animationDuration = `${duration}s`; + particle.style.animationDelay = `${delay}s`; + animationContainer.appendChild(particle); + } + } + + // --- Event Listeners --- + newJokeBtn.addEventListener('click', fetchJoke); + + // --- Initial Load --- + fetchJoke(); +}); \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机搞笑段子/接口集合.json b/frontend/60sapi/娱乐消遣/随机搞笑段子/接口集合.json new file mode 100644 index 00000000..90aa64a6 --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机搞笑段子/接口集合.json @@ -0,0 +1,47 @@ +{ + "api_name": "60s-api", + "api_version": "2.22.1", + "api_docs": "https://docs.60s-api.viki.moe", + "author": "Viki ", + "user_group": "595941841", + "github_repo": "https://github.com/vikiboss/60s", + "updated": "2025/09/01 11:12:08", + "updated_at": 1756696328000, + "endpoints": [ + "/v2/60s", + "/v2/answer", + "/v2/baike", + "/v2/bili", + "/v2/bing", + "/v2/changya", + "/v2/chemical", + "/v2/douyin", + "/v2/duanzi", + "/v2/epic", + "/v2/exchange_rate", + "/v2/fabing", + "/v2/hitokoto", + "/v2/ip", + "/v2/kfc", + "/v2/luck", + "/v2/maoyan", + "/v2/today_in_history", + "/v2/toutiao", + "/v2/weibo", + "/v2/zhihu", + "/v2/lunar", + "/v2/ai-news", + "/v2/awesome-js", + "/v2/qrcode", + "/v2/dad-joke", + "/v2/hacker-news/:type", + "/v2/og", + "/v2/hash", + "/v2/fanyi", + "/v2/fanyi/langs", + "/v2/weather", + "/v2/weather/forecast", + "/v2/ncm-rank", + "/v2/ncm-rank/:id" + ] +} \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机搞笑段子/返回接口.json b/frontend/60sapi/娱乐消遣/随机搞笑段子/返回接口.json new file mode 100644 index 00000000..4a6d180e --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机搞笑段子/返回接口.json @@ -0,0 +1,8 @@ +{ + "code": 200, + "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", + "data": { + "index": 347, + "duanzi": "我不想读书,主要是因为家里牛啊,猪啊羊啊都没人喂。" + } +} \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机运势/css/background.css b/frontend/60sapi/娱乐消遣/随机运势/css/background.css new file mode 100644 index 00000000..d18a8699 --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机运势/css/background.css @@ -0,0 +1,26 @@ +body { + background: linear-gradient(-45deg, #0a021a, #2a0d3f, #4a1a6c, #7b2f8f); + background-size: 400% 400%; + animation: gradientBG 20s ease infinite; + color: #ffffff; + font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; + margin: 0; + padding: 0; + display: flex; + justify-content: center; + align-items: center; + min-height: 100vh; + overflow-x: hidden; +} + +@keyframes gradientBG { + 0% { + background-position: 0% 50%; + } + 50% { + background-position: 100% 50%; + } + 100% { + background-position: 0% 50%; + } +} \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机运势/css/style.css b/frontend/60sapi/娱乐消遣/随机运势/css/style.css new file mode 100644 index 00000000..7792be02 --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机运势/css/style.css @@ -0,0 +1,342 @@ +.container { + text-align: center; + padding: 20px; + max-width: 600px; + width: 100%; + box-sizing: border-box; +} + +header h1 { + font-size: 2.8em; + color: #f0e6ff; + text-shadow: 0 0 10px #d1a9ff, 0 0 20px #d1a9ff; + margin-bottom: 0.2em; +} + +header p { + font-size: 1.2em; + color: #e0c8ff; + margin-bottom: 40px; +} + +.crystal-ball-container { + perspective: 1000px; + margin-bottom: 40px; +} + +.crystal-ball { + width: 200px; + height: 200px; + background: radial-gradient(circle at 30% 30%, rgba(255, 255, 255, 0.6), rgba(200, 180, 255, 0.1)); + border-radius: 50%; + margin: 0 auto; + position: relative; + box-shadow: 0 0 30px #c390ff, 0 0 60px #a060e0, inset 0 0 20px rgba(255, 220, 255, 0.3); + animation: float 6s ease-in-out infinite; + transform-style: preserve-3d; +} + +.reflection { + width: 80px; + height: 40px; + background: rgba(255, 255, 255, 0.3); + border-radius: 50%; + position: absolute; + top: 20px; + left: 40px; + transform: rotate(-30deg); + filter: blur(5px); +} + +.swirl { + position: absolute; + top: 50%; + left: 50%; + width: 120%; + height: 120%; + background: linear-gradient(45deg, rgba(255, 192, 203, 0.1), rgba(128, 0, 128, 0.2)); + border-radius: 50%; + animation: swirl 10s linear infinite; + transform: translate(-50%, -50%); +} + +@keyframes float { + 0%, 100% { transform: translateY(0); } + 50% { transform: translateY(-20px); } +} + +@keyframes swirl { + from { transform: translate(-50%, -50%) rotate(0deg); } + to { transform: translate(-50%, -50%) rotate(360deg); } +} + +.fortune-card { + background: rgba(255, 255, 255, 0.05); + border-radius: 15px; + padding: 30px; + margin-bottom: 30px; + min-height: 120px; + display: flex; + justify-content: center; + align-items: center; + backdrop-filter: blur(10px); + border: 1px solid rgba(255, 255, 255, 0.1); + box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37); + transition: opacity 0.5s ease-in-out; +} + +.fortune-content { + opacity: 0; + transition: opacity 0.5s ease-in-out; +} + +.fortune-content.visible { + opacity: 1; +} + +#luck-desc { + font-size: 2em; + color: #ffc0cb; + margin: 0 0 10px; +} + +#luck-tip { + font-size: 1.1em; + color: #e0e0e0; + margin: 0; + padding-bottom: 20px; /* Add some space before the new details */ +} + +.fortune-details { + display: flex; + justify-content: space-around; + margin-top: 20px; + padding-top: 20px; + border-top: 1px solid rgba(255, 255, 255, 0.2); +} + +.detail-item { + text-align: center; +} + +.detail-item h3 { + font-size: 0.9em; + color: #ffc0cb; + margin: 0 0 5px; + font-weight: normal; +} + +.detail-item p { + font-size: 1.2em; + margin: 0; + font-weight: bold; +} + +#lucky-color { + display: inline-block; + width: 24px; + height: 24px; + border-radius: 50%; + border: 2px solid white; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.5); + /* Remove the text content */ + font-size: 0; +} + +/* Tarot Card Styles */ +.tarot-container { + margin-top: 40px; + margin-bottom: 40px; +} + +.tarot-container h2 { + font-size: 1.5em; + color: #f0e6ff; + text-shadow: 0 0 8px #d1a9ff; + margin-bottom: 20px; +} + +.tarot-card-container { + width: 180px; + height: 280px; + perspective: 1000px; + margin: 0 auto; + cursor: pointer; +} + +.tarot-card-inner { + position: relative; + width: 100%; + height: 100%; + transition: transform 0.8s; + transform-style: preserve-3d; +} + +.tarot-card-container.flipped .tarot-card-inner { + transform: rotateY(180deg); +} + +.tarot-card-front, +.tarot-card-back { + position: absolute; + width: 100%; + height: 100%; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + border-radius: 10px; + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4); +} + +.tarot-card-back { + background: linear-gradient(135deg, #4a1a6c, #2a0d3f); + border: 2px solid #d1a9ff; + display: flex; + justify-content: center; + align-items: center; + font-size: 3em; + color: #d1a9ff; +} + +.tarot-card-back::after { + content: '✧'; /* A simple star symbol */ + text-shadow: 0 0 10px #f0e6ff; +} + +.tarot-card-front { + background: linear-gradient(135deg, #3e165b, #592883); + border: 2px solid #d1a9ff; + color: white; + transform: rotateY(180deg); + padding: 20px; + box-sizing: border-box; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +#tarot-name { + font-size: 1.4em; + color: #ffc0cb; + margin: 0 0 10px; +} + +#tarot-interpretation { + font-size: 0.9em; + text-align: center; + margin: 0; +} + +/* Side Decorations */ +.side-decor { + position: fixed; + top: 0; + bottom: 0; + width: 15vw; + height: 100vh; + pointer-events: none; + z-index: 0; +} + +.left-decor { + left: 0; +} + +.right-decor { + right: 0; +} + +.decor-symbol { + position: absolute; + color: rgba(209, 169, 255, 0.5); + text-shadow: 0 0 10px rgba(240, 230, 255, 0.7); + animation: floatSymbol 20s infinite ease-in-out; +} + +@keyframes floatSymbol { + 0%, 100% { + transform: translateY(0) rotate(0deg); + opacity: 0; + } + 25%, 75% { + opacity: 0.8; + } + 50% { + transform: translateY(-20vh) rotate(180deg); + opacity: 0.3; + } +} + +#get-fortune-btn { + background: linear-gradient(45deg, #da70d6, #8a2be2); + color: white; + border: none; + border-radius: 50px; + padding: 15px 30px; + font-size: 1.1em; + cursor: pointer; + transition: transform 0.2s, box-shadow 0.2s; + box-shadow: 0 0 15px #c390ff; +} + +#get-fortune-btn:hover { + transform: scale(1.05); + box-shadow: 0 0 25px #d1a9ff; +} + +#get-fortune-btn:active { + transform: scale(0.98); +} + +.loading-spinner { + border: 4px solid rgba(255, 255, 255, 0.2); + border-left-color: #ffc0cb; + border-radius: 50%; + width: 40px; + height: 40px; + animation: spin 1s linear infinite; + display: none; /* Hidden by default */ +} + +.loading-spinner.visible { + display: block; +} + +@keyframes spin { + to { transform: rotate(360deg); } +} + +footer { + margin-top: 40px; + color: rgba(255, 255, 255, 0.6); +} + +/* Responsive Design */ +@media (max-width: 768px) { + header h1 { + font-size: 2.2em; + } + .crystal-ball { + width: 150px; + height: 150px; + } + .fortune-card { + padding: 20px; + } + .fortune-details { + flex-direction: column; + gap: 15px; + } + + .tarot-card-container { + width: 150px; + height: 233px; + } +} + +/* Hide side decor on smaller screens */ +@media (max-width: 1200px) { + .side-decor { + display: none; + } +} \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机运势/index.html b/frontend/60sapi/娱乐消遣/随机运势/index.html new file mode 100644 index 00000000..4214eeb4 --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机运势/index.html @@ -0,0 +1,71 @@ + + + + + + 水晶球占卜 + + + + +
+
+
+

水晶球占卜

+

洞察你今日的运势

+
+
+
+
+
+
+
+
+
+
+
+

+

+
+
+

今日咒语

+

+
+
+

幸运色

+

+
+
+

幸运数字

+

+
+
+
+
+ + +
+

每日塔罗指引

+
+
+
+ +
+
+

+

+
+
+
+
+ + +
+
+

仅供娱乐,祝您好运

+
+
+
+ + + \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机运势/js/script.js b/frontend/60sapi/娱乐消遣/随机运势/js/script.js new file mode 100644 index 00000000..28f7d514 --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机运势/js/script.js @@ -0,0 +1,175 @@ +document.addEventListener('DOMContentLoaded', () => { + const getFortuneBtn = document.getElementById('get-fortune-btn'); + const fortuneCard = document.getElementById('fortune-card'); + const fortuneContent = fortuneCard.querySelector('.fortune-content'); + const luckDescElem = document.getElementById('luck-desc'); + const luckTipElem = document.getElementById('luck-tip'); + const fortuneSummaryElem = document.getElementById('fortune-summary'); + const luckyColorElem = document.getElementById('lucky-color'); + const luckyNumberElem = document.getElementById('lucky-number'); + const loadingSpinner = fortuneCard.querySelector('.loading-spinner'); + const tarotCardContainer = document.getElementById('tarot-card'); + const tarotNameElem = document.getElementById('tarot-name'); + const tarotInterpretationElem = document.getElementById('tarot-interpretation'); + + const apiBaseUrls = [ + "https://60s.api.shumengya.top", + "https://60s-cf.viki.moe", + "https://60s.viki.moe", + "https://60s.b23.run", + "https://60s.114128.xyz", + "https://60s-cf.114128.xyz" + ]; + const apiPath = "/v2/luck"; + + const mantras = [ + "顺其自然,皆是美好。", + "相信直觉,它知道方向。", + "每一次呼吸都是新的开始。", + "心怀感恩,好运自来。", + "拥抱变化,发现惊喜。", + "你的能量,超乎想象。", + "保持微笑,宇宙会回应你。" + ]; + + const tarotDeck = [ + { name: "愚者", interpretation: "新的开始,无限的潜力,天真和自由。勇敢地迈出第一步。" }, + { name: "魔术师", interpretation: "创造力,意志力,显化。你拥有实现目标所需的一切资源。" }, + { name: "女祭司", interpretation: "直觉,潜意识,神秘。倾听你内心的声音,智慧在你之内。" }, + { name: "皇后", interpretation: "丰饶,母性,创造。享受生活的美好,与自然和谐相处。" }, + { name: "皇帝", interpretation: "权威,结构,控制。建立秩序和纪律,掌控你的生活。" }, + { name: "教皇", interpretation: "传统,信仰,灵性指导。寻求智慧和知识,遵循传统。" }, + { name: "恋人", interpretation: "爱,和谐,选择。做出与你内心价值观一致的决定。" }, + { name: "战车", interpretation: "胜利,决心,控制。以坚定的意志力克服障碍,勇往直前。" }, + { name: "力量", interpretation: "勇气,内在力量,同情。用温柔和耐心驯服内心的野兽。" }, + { name: "隐士", interpretation: "内省,孤独,寻求真理。花时间独处,向内寻求答案。" }, + { name: "命运之轮", interpretation: "变化,命运,转折点。生活总在变化,顺应潮流。" }, + { name: "正义", interpretation: "公平,真理,因果。为你的行为负责,寻求平衡。" }, + { name: "倒吊人", interpretation: "新的视角,顺从,牺牲。放手,从不同的角度看问题。" }, + { name: "死神", interpretation: "结束,转变,新生。一个周期的结束是另一个周期的开始。" }, + { name: "节制", interpretation: "平衡,和谐,耐心。融合对立的力量,找到中间道路。" }, + { name: "恶魔", interpretation: "束缚,物质主义,诱惑。认识到你的束缚,并寻求解放。" }, + { name: "塔", interpretation: "突变,启示,解放。旧的结构正在崩塌,为新的结构让路。" }, + { name: "星星", interpretation: "希望,灵感,平静。在黑暗之后,总有希望的曙光。" }, + { name: "月亮", interpretation: "幻觉,恐惧,潜意识。面对你的恐惧,相信你的直觉。" }, + { name: "太阳", interpretation: "成功,喜悦,活力。拥抱光明,享受生活的乐趣。" }, + { name: "审判", interpretation: "觉醒,重生,评估。一个反思和更新的时刻。" }, + { name: "世界", interpretation: "完成,整合,成就。一个旅程的成功结束,庆祝你的成就。" } + ]; + + let currentApiIndex = 0; + + const showLoading = (isLoading) => { + if (isLoading) { + fortuneContent.classList.remove('visible'); + loadingSpinner.classList.add('visible'); + } else { + loadingSpinner.classList.remove('visible'); + setTimeout(() => { + fortuneContent.classList.add('visible'); + }, 100); + } + }; + + const fetchFortune = async () => { + showLoading(true); + tarotCardContainer.classList.remove('flipped'); // Reset card on new fetch + + try { + const url = apiBaseUrls[currentApiIndex] + apiPath; + const response = await fetch(url, { timeout: 5000 }); + if (!response.ok) { + throw new Error('Network response was not ok'); + } + const data = await response.json(); + + if (data.code === 200 && data.data) { + updateFortune(data.data); + drawTarotCard(); // Draw a tarot card on success + } else { + throw new Error('Invalid data format'); + } + } catch (error) { + console.error(`API error with ${apiBaseUrls[currentApiIndex]}:`, error); + currentApiIndex = (currentApiIndex + 1) % apiBaseUrls.length; + if (currentApiIndex !== 0) { + fetchFortune(); // Try next API + } else { + displayError(); + } + } + }; + + const updateFortune = (data) => { + luckDescElem.textContent = data.luck_desc || '运势'; + luckTipElem.textContent = data.luck_tip || '今日运势平平,保持好心情。'; + + // Generate and display additional details + fortuneSummaryElem.textContent = mantras[Math.floor(Math.random() * mantras.length)]; + luckyColorElem.style.backgroundColor = `#${Math.floor(Math.random()*16777215).toString(16).padStart(6, '0')}`; + luckyNumberElem.textContent = Math.floor(Math.random() * 100); + + showLoading(false); + }; + + const displayError = () => { + luckDescElem.textContent = '占卜失败'; + luckTipElem.textContent = '无法连接到星辰之力,请稍后再试。'; + fortuneSummaryElem.textContent = '---'; + luckyColorElem.style.backgroundColor = 'transparent'; + luckyNumberElem.textContent = '-'; + showLoading(false); + tarotNameElem.textContent = '指引中断'; + tarotInterpretationElem.textContent = '星辰之力暂时无法连接。'; + tarotCardContainer.classList.add('flipped'); // Show error on card + }; + + const drawTarotCard = () => { + const card = tarotDeck[Math.floor(Math.random() * tarotDeck.length)]; + tarotNameElem.textContent = card.name; + tarotInterpretationElem.textContent = card.interpretation; + + // Flip the card after a short delay to allow the main content to appear + setTimeout(() => { + tarotCardContainer.classList.add('flipped'); + }, 500); + }; + + const createSideDecorations = () => { + const leftContainer = document.querySelector('.left-decor'); + const rightContainer = document.querySelector('.right-decor'); + if (!leftContainer || !rightContainer) return; + + const symbols = ['✧', '✦', '☾', '✶', '✵', '✩', '✨']; + const symbolCount = 15; // Number of symbols per side + + const createSymbols = (container) => { + for (let i = 0; i < symbolCount; i++) { + const symbol = document.createElement('span'); + symbol.classList.add('decor-symbol'); + symbol.textContent = symbols[Math.floor(Math.random() * symbols.length)]; + + // Randomize properties for a more natural look + symbol.style.top = `${Math.random() * 90}vh`; + symbol.style.left = `${Math.random() * 80}%`; + symbol.style.fontSize = `${Math.random() * 20 + 10}px`; + symbol.style.animationDelay = `${Math.random() * 20}s`; + symbol.style.animationDuration = `${Math.random() * 20 + 15}s`; // Duration between 15s and 35s + + container.appendChild(symbol); + } + }; + + createSymbols(leftContainer); + createSymbols(rightContainer); + }; + + getFortuneBtn.addEventListener('click', fetchFortune); + tarotCardContainer.addEventListener('click', () => { + tarotCardContainer.classList.toggle('flipped'); + }); + + // Initial actions on page load + fetchFortune(); + createSideDecorations(); +}); \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机运势/接口集合.json b/frontend/60sapi/娱乐消遣/随机运势/接口集合.json new file mode 100644 index 00000000..04e92b7f --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机运势/接口集合.json @@ -0,0 +1,7 @@ +[ + "https://60s-cf.viki.moe", + "https://60s.viki.moe", + "https://60s.b23.run", + "https://60s.114128.xyz", + "https://60s-cf.114128.xyz" +] diff --git a/frontend/60sapi/娱乐消遣/随机运势/返回接口.json b/frontend/60sapi/娱乐消遣/随机运势/返回接口.json new file mode 100644 index 00000000..f5498794 --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机运势/返回接口.json @@ -0,0 +1,10 @@ +{ + "code": 200, + "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", + "data": { + "luck_desc": "恋愛運", + "luck_rank": 21, + "luck_tip": "闪亮的邂逅之日!顺其自然吧", + "luck_tip_index": 19 + } +} \ No newline at end of file From e62a2d7127694355c8935650ea12dba680c99af5 Mon Sep 17 00:00:00 2001 From: Chance_Li <2753591994@qq.com> Date: Wed, 3 Sep 2025 12:55:23 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E5=AE=9E=E7=94=A8=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../实用功能/公网IP地址/css/background.css | 233 ++++ .../60sapi/实用功能/公网IP地址/css/style.css | 445 +++++++ .../60sapi/实用功能/公网IP地址/index.html | 139 ++ .../60sapi/实用功能/公网IP地址/js/script.js | 315 +++++ .../60sapi/实用功能/公网IP地址/接口集合.json | 3 + .../60sapi/实用功能/公网IP地址/返回接口.json | 0 .../实用功能/哈希解压压缩/css/style.css | 561 ++++++++ .../60sapi/实用功能/哈希解压压缩/index.html | 221 ++++ .../60sapi/实用功能/哈希解压压缩/js/script.js | 380 ++++++ .../实用功能/哈希解压压缩/接口集合.json | 3 + .../实用功能/哈希解压压缩/返回接口.json | 33 + frontend/60sapi/实用功能/生成要求模板.txt | 8 + .../实用功能/链接OG信息/css/background.css | 232 ++++ .../60sapi/实用功能/链接OG信息/css/style.css | 1159 +++++++++++++++++ .../60sapi/实用功能/链接OG信息/index.html | 223 ++++ .../60sapi/实用功能/链接OG信息/js/script.js | 555 ++++++++ .../60sapi/实用功能/链接OG信息/接口集合.json | 3 + .../60sapi/实用功能/链接OG信息/返回接口.json | 66 + 18 files changed, 4579 insertions(+) create mode 100644 frontend/60sapi/实用功能/公网IP地址/css/background.css create mode 100644 frontend/60sapi/实用功能/公网IP地址/css/style.css create mode 100644 frontend/60sapi/实用功能/公网IP地址/index.html create mode 100644 frontend/60sapi/实用功能/公网IP地址/js/script.js create mode 100644 frontend/60sapi/实用功能/公网IP地址/接口集合.json create mode 100644 frontend/60sapi/实用功能/公网IP地址/返回接口.json create mode 100644 frontend/60sapi/实用功能/哈希解压压缩/css/style.css create mode 100644 frontend/60sapi/实用功能/哈希解压压缩/index.html create mode 100644 frontend/60sapi/实用功能/哈希解压压缩/js/script.js create mode 100644 frontend/60sapi/实用功能/哈希解压压缩/接口集合.json create mode 100644 frontend/60sapi/实用功能/哈希解压压缩/返回接口.json create mode 100644 frontend/60sapi/实用功能/生成要求模板.txt create mode 100644 frontend/60sapi/实用功能/链接OG信息/css/background.css create mode 100644 frontend/60sapi/实用功能/链接OG信息/css/style.css create mode 100644 frontend/60sapi/实用功能/链接OG信息/index.html create mode 100644 frontend/60sapi/实用功能/链接OG信息/js/script.js create mode 100644 frontend/60sapi/实用功能/链接OG信息/接口集合.json create mode 100644 frontend/60sapi/实用功能/链接OG信息/返回接口.json diff --git a/frontend/60sapi/实用功能/公网IP地址/css/background.css b/frontend/60sapi/实用功能/公网IP地址/css/background.css new file mode 100644 index 00000000..74f65ebc --- /dev/null +++ b/frontend/60sapi/实用功能/公网IP地址/css/background.css @@ -0,0 +1,233 @@ +/* 动态背景样式 */ +body::before { + content: ''; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + z-index: -2; +} + +body::after { + content: ''; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: + radial-gradient(circle at 20% 80%, rgba(120, 119, 198, 0.3) 0%, transparent 50%), + radial-gradient(circle at 80% 20%, rgba(255, 119, 198, 0.3) 0%, transparent 50%), + radial-gradient(circle at 40% 40%, rgba(120, 219, 255, 0.3) 0%, transparent 50%); + z-index: -1; + animation: backgroundMove 20s ease-in-out infinite; +} + +@keyframes backgroundMove { + 0%, 100% { + background: + radial-gradient(circle at 20% 80%, rgba(120, 119, 198, 0.3) 0%, transparent 50%), + radial-gradient(circle at 80% 20%, rgba(255, 119, 198, 0.3) 0%, transparent 50%), + radial-gradient(circle at 40% 40%, rgba(120, 219, 255, 0.3) 0%, transparent 50%); + } + 25% { + background: + radial-gradient(circle at 60% 30%, rgba(120, 119, 198, 0.3) 0%, transparent 50%), + radial-gradient(circle at 30% 70%, rgba(255, 119, 198, 0.3) 0%, transparent 50%), + radial-gradient(circle at 80% 80%, rgba(120, 219, 255, 0.3) 0%, transparent 50%); + } + 50% { + background: + radial-gradient(circle at 80% 60%, rgba(120, 119, 198, 0.3) 0%, transparent 50%), + radial-gradient(circle at 20% 30%, rgba(255, 119, 198, 0.3) 0%, transparent 50%), + radial-gradient(circle at 60% 70%, rgba(120, 219, 255, 0.3) 0%, transparent 50%); + } + 75% { + background: + radial-gradient(circle at 40% 90%, rgba(120, 119, 198, 0.3) 0%, transparent 50%), + radial-gradient(circle at 70% 10%, rgba(255, 119, 198, 0.3) 0%, transparent 50%), + radial-gradient(circle at 20% 60%, rgba(120, 219, 255, 0.3) 0%, transparent 50%); + } +} + +/* 浮动粒子效果 */ +.particles { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + pointer-events: none; + z-index: -1; +} + +.particle { + position: absolute; + width: 4px; + height: 4px; + background: rgba(255, 255, 255, 0.5); + border-radius: 50%; + animation: float 15s infinite linear; +} + +.particle:nth-child(1) { + left: 10%; + animation-delay: 0s; + animation-duration: 12s; +} + +.particle:nth-child(2) { + left: 20%; + animation-delay: 2s; + animation-duration: 18s; +} + +.particle:nth-child(3) { + left: 30%; + animation-delay: 4s; + animation-duration: 15s; +} + +.particle:nth-child(4) { + left: 40%; + animation-delay: 6s; + animation-duration: 20s; +} + +.particle:nth-child(5) { + left: 50%; + animation-delay: 8s; + animation-duration: 14s; +} + +.particle:nth-child(6) { + left: 60%; + animation-delay: 10s; + animation-duration: 16s; +} + +.particle:nth-child(7) { + left: 70%; + animation-delay: 12s; + animation-duration: 22s; +} + +.particle:nth-child(8) { + left: 80%; + animation-delay: 14s; + animation-duration: 13s; +} + +.particle:nth-child(9) { + left: 90%; + animation-delay: 16s; + animation-duration: 19s; +} + +.particle:nth-child(10) { + left: 15%; + animation-delay: 18s; + animation-duration: 17s; +} + +@keyframes float { + 0% { + transform: translateY(100vh) rotate(0deg); + opacity: 0; + } + 10% { + opacity: 1; + } + 90% { + opacity: 1; + } + 100% { + transform: translateY(-100px) rotate(360deg); + opacity: 0; + } +} + +/* 网格背景效果 */ +.grid-background { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-image: + linear-gradient(rgba(255, 255, 255, 0.1) 1px, transparent 1px), + linear-gradient(90deg, rgba(255, 255, 255, 0.1) 1px, transparent 1px); + background-size: 50px 50px; + z-index: -1; + opacity: 0.3; + animation: gridMove 30s linear infinite; +} + +@keyframes gridMove { + 0% { + transform: translate(0, 0); + } + 100% { + transform: translate(50px, 50px); + } +} + +/* 光晕效果 */ +.glow-effect { + position: fixed; + top: 50%; + left: 50%; + width: 300px; + height: 300px; + background: radial-gradient(circle, rgba(74, 144, 226, 0.2) 0%, transparent 70%); + border-radius: 50%; + transform: translate(-50%, -50%); + z-index: -1; + animation: pulse 4s ease-in-out infinite; +} + +@keyframes pulse { + 0%, 100% { + transform: translate(-50%, -50%) scale(1); + opacity: 0.5; + } + 50% { + transform: translate(-50%, -50%) scale(1.2); + opacity: 0.8; + } +} + +/* 响应式背景调整 */ +@media (max-width: 768px) { + .grid-background { + background-size: 30px 30px; + } + + .glow-effect { + width: 200px; + height: 200px; + } + + .particle { + width: 3px; + height: 3px; + } +} + +@media (max-width: 480px) { + .grid-background { + background-size: 20px 20px; + } + + .glow-effect { + width: 150px; + height: 150px; + } + + .particle { + width: 2px; + height: 2px; + } +} \ No newline at end of file diff --git a/frontend/60sapi/实用功能/公网IP地址/css/style.css b/frontend/60sapi/实用功能/公网IP地址/css/style.css new file mode 100644 index 00000000..30d4768f --- /dev/null +++ b/frontend/60sapi/实用功能/公网IP地址/css/style.css @@ -0,0 +1,445 @@ +/* 全局样式重置 */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; + line-height: 1.6; + color: #333; + min-height: 100vh; + overflow-x: hidden; +} + +/* 容器样式 */ +.container { + min-height: 100vh; + display: flex; + flex-direction: column; + position: relative; + z-index: 1; +} + +/* 头部样式 */ +.header { + text-align: center; + padding: 3rem 2rem 2rem; + background: linear-gradient(135deg, rgba(74, 144, 226, 0.1), rgba(80, 200, 120, 0.1)); + backdrop-filter: blur(10px); + border-bottom: 1px solid rgba(255, 255, 255, 0.2); +} + +.header h1 { + font-size: 2.5rem; + font-weight: 700; + background: linear-gradient(135deg, #4a90e2, #50c878); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + margin-bottom: 0.5rem; + text-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); +} + +.header h1 i { + margin-right: 0.5rem; + background: linear-gradient(135deg, #4a90e2, #50c878); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; +} + +.subtitle { + font-size: 1.1rem; + color: #666; + font-weight: 300; +} + +/* 主要内容区域 */ +.main-content { + flex: 1; + padding: 2rem; + max-width: 800px; + margin: 0 auto; + width: 100%; +} + +/* 查询按钮区域 */ +.query-section { + text-align: center; + margin-bottom: 2rem; +} + +.query-btn { + background: linear-gradient(135deg, #4a90e2, #50c878); + color: white; + border: none; + padding: 1rem 2rem; + font-size: 1.1rem; + font-weight: 600; + border-radius: 50px; + cursor: pointer; + transition: all 0.3s ease; + box-shadow: 0 4px 15px rgba(74, 144, 226, 0.3); + display: inline-flex; + align-items: center; + gap: 0.5rem; + min-width: 200px; + justify-content: center; +} + +.query-btn:hover { + transform: translateY(-2px); + box-shadow: 0 6px 20px rgba(74, 144, 226, 0.4); + background: linear-gradient(135deg, #3a7bc8, #40a868); +} + +.query-btn:active { + transform: translateY(0); +} + +.query-btn:disabled { + opacity: 0.6; + cursor: not-allowed; + transform: none; +} + +/* 加载动画 */ +.loading { + text-align: center; + padding: 2rem; +} + +.spinner { + width: 50px; + height: 50px; + border: 4px solid #f3f3f3; + border-top: 4px solid #4a90e2; + border-radius: 50%; + animation: spin 1s linear infinite; + margin: 0 auto 1rem; +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +.loading p { + color: #666; + font-size: 1rem; +} + +/* IP信息卡片 */ +.ip-info { + animation: fadeInUp 0.6s ease; +} + +@keyframes fadeInUp { + from { + opacity: 0; + transform: translateY(30px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.ip-card { + background: rgba(255, 255, 255, 0.9); + backdrop-filter: blur(10px); + border-radius: 20px; + padding: 2rem; + margin-bottom: 2rem; + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1); + border: 1px solid rgba(255, 255, 255, 0.2); +} + +.ip-header { + display: flex; + align-items: center; + gap: 0.5rem; + margin-bottom: 1.5rem; + padding-bottom: 1rem; + border-bottom: 2px solid #f0f0f0; +} + +.ip-header i { + font-size: 1.5rem; + color: #4a90e2; +} + +.ip-header h2 { + font-size: 1.5rem; + font-weight: 600; + color: #333; +} + +.ip-display { + display: flex; + align-items: center; + justify-content: center; + gap: 1rem; + margin-bottom: 1.5rem; + padding: 1.5rem; + background: linear-gradient(135deg, rgba(74, 144, 226, 0.1), rgba(80, 200, 120, 0.1)); + border-radius: 15px; + border: 2px solid rgba(74, 144, 226, 0.2); +} + +.ip-address { + font-size: 2rem; + font-weight: 700; + font-family: 'Courier New', monospace; + color: #2c3e50; + background: linear-gradient(135deg, #4a90e2, #50c878); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + text-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); +} + +.copy-btn { + background: #4a90e2; + color: white; + border: none; + padding: 0.5rem; + border-radius: 8px; + cursor: pointer; + transition: all 0.3s ease; + font-size: 1rem; + width: 40px; + height: 40px; + display: flex; + align-items: center; + justify-content: center; +} + +.copy-btn:hover { + background: #3a7bc8; + transform: scale(1.1); +} + +.ip-details { + display: grid; + gap: 1rem; +} + +.detail-item { + display: flex; + align-items: center; + gap: 0.5rem; + padding: 0.75rem; + background: rgba(248, 249, 250, 0.8); + border-radius: 10px; + transition: all 0.3s ease; +} + +.detail-item:hover { + background: rgba(74, 144, 226, 0.1); + transform: translateX(5px); +} + +.detail-item i { + color: #4a90e2; + width: 20px; + text-align: center; +} + +.detail-item .label { + font-weight: 600; + color: #555; + min-width: 80px; +} + +.detail-item .value { + color: #333; + font-weight: 500; +} + +/* IP地址说明区域 */ +.ip-explanation { + background: rgba(255, 255, 255, 0.9); + backdrop-filter: blur(10px); + border-radius: 20px; + padding: 2rem; + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1); + border: 1px solid rgba(255, 255, 255, 0.2); +} + +.ip-explanation h3 { + display: flex; + align-items: center; + gap: 0.5rem; + margin-bottom: 1rem; + font-size: 1.3rem; + color: #333; +} + +.ip-explanation h3 i { + color: #4a90e2; +} + +.ip-explanation p { + color: #666; + line-height: 1.8; + margin-bottom: 1.5rem; +} + +.features { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); + gap: 1rem; +} + +.feature-item { + display: flex; + align-items: flex-start; + gap: 1rem; + padding: 1rem; + background: rgba(248, 249, 250, 0.8); + border-radius: 12px; + transition: all 0.3s ease; +} + +.feature-item:hover { + background: rgba(74, 144, 226, 0.1); + transform: translateY(-2px); +} + +.feature-item i { + color: #4a90e2; + font-size: 1.5rem; + margin-top: 0.2rem; +} + +.feature-item h4 { + font-size: 1rem; + font-weight: 600; + color: #333; + margin-bottom: 0.3rem; +} + +.feature-item p { + font-size: 0.9rem; + color: #666; + line-height: 1.5; + margin: 0; +} + +/* 错误信息 */ +.error-message { + text-align: center; + padding: 2rem; + background: rgba(255, 255, 255, 0.9); + backdrop-filter: blur(10px); + border-radius: 20px; + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1); + border: 1px solid rgba(255, 99, 99, 0.3); + animation: fadeInUp 0.6s ease; +} + +.error-message i { + font-size: 3rem; + color: #ff6b6b; + margin-bottom: 1rem; +} + +.error-message p { + color: #666; + font-size: 1.1rem; + margin-bottom: 1.5rem; +} + +.retry-btn { + background: #ff6b6b; + color: white; + border: none; + padding: 0.75rem 1.5rem; + font-size: 1rem; + font-weight: 600; + border-radius: 25px; + cursor: pointer; + transition: all 0.3s ease; +} + +.retry-btn:hover { + background: #ff5252; + transform: translateY(-2px); + box-shadow: 0 4px 15px rgba(255, 107, 107, 0.3); +} + +/* 页脚 */ +.footer { + text-align: center; + padding: 2rem; + background: rgba(248, 249, 250, 0.8); + backdrop-filter: blur(10px); + border-top: 1px solid rgba(255, 255, 255, 0.2); + color: #666; + font-size: 0.9rem; +} + +/* 响应式设计 */ +@media (max-width: 768px) { + .header { + padding: 2rem 1rem 1.5rem; + } + + .header h1 { + font-size: 2rem; + } + + .main-content { + padding: 1rem; + } + + .ip-card, .ip-explanation { + padding: 1.5rem; + } + + .ip-address { + font-size: 1.5rem; + } + + .ip-display { + flex-direction: column; + gap: 1rem; + } + + .features { + grid-template-columns: 1fr; + } + + .detail-item { + flex-direction: column; + align-items: flex-start; + gap: 0.3rem; + } + + .detail-item .label { + min-width: auto; + } +} + +@media (max-width: 480px) { + .header h1 { + font-size: 1.8rem; + } + + .query-btn { + padding: 0.875rem 1.5rem; + font-size: 1rem; + min-width: 180px; + } + + .ip-address { + font-size: 1.3rem; + } + + .ip-card, .ip-explanation { + padding: 1rem; + } +} \ No newline at end of file diff --git a/frontend/60sapi/实用功能/公网IP地址/index.html b/frontend/60sapi/实用功能/公网IP地址/index.html new file mode 100644 index 00000000..875fb9f0 --- /dev/null +++ b/frontend/60sapi/实用功能/公网IP地址/index.html @@ -0,0 +1,139 @@ + + + + + + 公网IP地址查询 + + + + + +
+ +
+

公网IP地址查询

+

快速获取您的公网IP地址信息

+
+ + +
+ +
+ +
+ + + + + + + + + +
+ + +
+

© 2024 公网IP地址查询工具 | 数据来源: 60s.viki.moe

+
+
+ + + + \ No newline at end of file diff --git a/frontend/60sapi/实用功能/公网IP地址/js/script.js b/frontend/60sapi/实用功能/公网IP地址/js/script.js new file mode 100644 index 00000000..4db5e4bd --- /dev/null +++ b/frontend/60sapi/实用功能/公网IP地址/js/script.js @@ -0,0 +1,315 @@ +// 公网IP地址查询应用 +class IPQueryApp { + constructor() { + this.apiEndpoint = 'https://60s.viki.moe/v2/ip'; + this.init(); + } + + // 初始化应用 + init() { + this.bindEvents(); + this.createParticles(); + this.createBackgroundElements(); + console.log('IP查询应用初始化完成'); + } + + // 绑定事件 + bindEvents() { + const queryBtn = document.getElementById('queryBtn'); + const retryBtn = document.getElementById('retryBtn'); + const copyBtn = document.getElementById('copyBtn'); + + if (queryBtn) { + queryBtn.addEventListener('click', () => this.queryIP()); + } + + if (retryBtn) { + retryBtn.addEventListener('click', () => this.queryIP()); + } + + if (copyBtn) { + copyBtn.addEventListener('click', () => this.copyIP()); + } + + // 页面加载完成后自动查询一次 + document.addEventListener('DOMContentLoaded', () => { + setTimeout(() => this.queryIP(), 500); + }); + } + + // 创建浮动粒子 + createParticles() { + const particlesContainer = document.createElement('div'); + particlesContainer.className = 'particles'; + document.body.appendChild(particlesContainer); + + for (let i = 0; i < 10; i++) { + const particle = document.createElement('div'); + particle.className = 'particle'; + particlesContainer.appendChild(particle); + } + } + + // 创建背景元素 + createBackgroundElements() { + // 创建网格背景 + const gridBackground = document.createElement('div'); + gridBackground.className = 'grid-background'; + document.body.appendChild(gridBackground); + + // 创建光晕效果 + const glowEffect = document.createElement('div'); + glowEffect.className = 'glow-effect'; + document.body.appendChild(glowEffect); + } + + // 显示加载状态 + showLoading() { + const loading = document.getElementById('loading'); + const ipInfo = document.getElementById('ipInfo'); + const errorMessage = document.getElementById('errorMessage'); + const queryBtn = document.getElementById('queryBtn'); + + if (loading) loading.style.display = 'block'; + if (ipInfo) ipInfo.style.display = 'none'; + if (errorMessage) errorMessage.style.display = 'none'; + if (queryBtn) { + queryBtn.disabled = true; + queryBtn.innerHTML = ' 查询中...'; + } + } + + // 隐藏加载状态 + hideLoading() { + const loading = document.getElementById('loading'); + const queryBtn = document.getElementById('queryBtn'); + + if (loading) loading.style.display = 'none'; + if (queryBtn) { + queryBtn.disabled = false; + queryBtn.innerHTML = ' 查询我的IP'; + } + } + + // 显示错误信息 + showError(message) { + const errorMessage = document.getElementById('error-message'); + const ipInfo = document.getElementById('ip-info'); + + if (errorMessage) { + errorMessage.style.display = 'block'; + const errorText = errorMessage.querySelector('p'); + if (errorText) errorText.textContent = message || '获取IP信息失败,请稍后重试'; + } + if (ipInfo) ipInfo.style.display = 'none'; + + this.hideLoading(); + } + + // 查询IP地址 + async queryIP() { + try { + this.showLoading(); + console.log('开始查询IP地址...'); + + const response = await fetch(this.apiEndpoint, { + method: 'GET', + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json' + } + }); + + console.log('API响应状态:', response.status); + + if (!response.ok) { + throw new Error(`HTTP错误: ${response.status}`); + } + + const data = await response.json(); + console.log('API返回数据:', data); + + if (data.code === 200 && data.data) { + this.displayIPInfo(data.data); + } else { + throw new Error(data.message || '获取IP信息失败'); + } + + } catch (error) { + console.error('查询IP失败:', error); + this.showError(error.message); + } + } + + // 显示IP信息 + displayIPInfo(data) { + const ipInfo = document.getElementById('ip-info'); + const errorMessage = document.getElementById('error-message'); + + // 更新IP地址显示 + const ipAddressElement = document.getElementById('ip-address'); + if (ipAddressElement && data.ip) { + ipAddressElement.textContent = data.ip; + } + + // 更新查询时间 + const queryTimeElement = document.getElementById('query-time'); + if (queryTimeElement) { + const now = new Date(); + queryTimeElement.textContent = now.toLocaleString('zh-CN'); + } + + // 更新详细信息 + this.updateDetailItem('location', data.location || '未知'); + this.updateDetailItem('isp', data.isp || '未知'); + this.updateDetailItem('country', data.country || '未知'); + this.updateDetailItem('region', data.region || '未知'); + this.updateDetailItem('city', data.city || '未知'); + this.updateDetailItem('timezone', data.timezone || '未知'); + + // 显示IP信息,隐藏错误信息 + if (ipInfo) ipInfo.style.display = 'block'; + if (errorMessage) errorMessage.style.display = 'none'; + + this.hideLoading(); + console.log('IP信息显示完成'); + } + + // 更新详细信息项 + updateDetailItem(id, value) { + const element = document.getElementById(id); + if (element) { + element.textContent = value; + } + } + + // 复制IP地址 + async copyIP() { + const ipAddressElement = document.getElementById('ip-address'); + const copyBtn = document.getElementById('copyBtn'); + + if (!ipAddressElement || !ipAddressElement.textContent) { + this.showToast('没有可复制的IP地址', 'error'); + return; + } + + try { + await navigator.clipboard.writeText(ipAddressElement.textContent); + + // 更新按钮状态 + if (copyBtn) { + const originalHTML = copyBtn.innerHTML; + copyBtn.innerHTML = ''; + copyBtn.style.background = '#50c878'; + + setTimeout(() => { + copyBtn.innerHTML = originalHTML; + copyBtn.style.background = '#4a90e2'; + }, 1500); + } + + this.showToast('IP地址已复制到剪贴板', 'success'); + console.log('IP地址已复制:', ipAddressElement.textContent); + + } catch (error) { + console.error('复制失败:', error); + this.showToast('复制失败,请手动选择复制', 'error'); + } + } + + // 显示提示消息 + showToast(message, type = 'info') { + // 移除已存在的toast + const existingToast = document.querySelector('.toast'); + if (existingToast) { + existingToast.remove(); + } + + // 创建新的toast + const toast = document.createElement('div'); + toast.className = `toast toast-${type}`; + toast.innerHTML = ` + + ${message} + `; + + // 添加toast样式 + toast.style.cssText = ` + position: fixed; + top: 20px; + right: 20px; + background: ${type === 'success' ? '#50c878' : type === 'error' ? '#ff6b6b' : '#4a90e2'}; + color: white; + padding: 1rem 1.5rem; + border-radius: 10px; + box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2); + z-index: 1000; + display: flex; + align-items: center; + gap: 0.5rem; + font-weight: 500; + animation: slideInRight 0.3s ease; + max-width: 300px; + `; + + // 添加动画样式 + const style = document.createElement('style'); + style.textContent = ` + @keyframes slideInRight { + from { + transform: translateX(100%); + opacity: 0; + } + to { + transform: translateX(0); + opacity: 1; + } + } + @keyframes slideOutRight { + from { + transform: translateX(0); + opacity: 1; + } + to { + transform: translateX(100%); + opacity: 0; + } + } + `; + document.head.appendChild(style); + + document.body.appendChild(toast); + + // 3秒后自动移除 + setTimeout(() => { + toast.style.animation = 'slideOutRight 0.3s ease'; + setTimeout(() => { + if (toast.parentNode) { + toast.remove(); + } + if (style.parentNode) { + style.remove(); + } + }, 300); + }, 3000); + } + + // 格式化时间 + formatTime(timestamp) { + const date = new Date(timestamp); + return date.toLocaleString('zh-CN', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + second: '2-digit' + }); + } +} + +// 初始化应用 +const app = new IPQueryApp(); + +// 导出到全局作用域(用于调试) +window.IPQueryApp = app; \ No newline at end of file diff --git a/frontend/60sapi/实用功能/公网IP地址/接口集合.json b/frontend/60sapi/实用功能/公网IP地址/接口集合.json new file mode 100644 index 00000000..60c81034 --- /dev/null +++ b/frontend/60sapi/实用功能/公网IP地址/接口集合.json @@ -0,0 +1,3 @@ +[ + "https://60s.viki.moe/v2/ip" +] diff --git a/frontend/60sapi/实用功能/公网IP地址/返回接口.json b/frontend/60sapi/实用功能/公网IP地址/返回接口.json new file mode 100644 index 00000000..e69de29b diff --git a/frontend/60sapi/实用功能/哈希解压压缩/css/style.css b/frontend/60sapi/实用功能/哈希解压压缩/css/style.css new file mode 100644 index 00000000..4b94a03d --- /dev/null +++ b/frontend/60sapi/实用功能/哈希解压压缩/css/style.css @@ -0,0 +1,561 @@ +/* Reset and Base Styles */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + min-height: 100vh; + color: #333; + overflow-x: hidden; +} + +.container { + max-width: 1400px; + margin: 0 auto; + padding: 20px; + position: relative; +} + +/* Header Styles */ +.header { + text-align: center; + margin-bottom: 40px; + position: relative; + z-index: 2; +} + +.header-content { + background: rgba(255, 255, 255, 0.1); + backdrop-filter: blur(20px); + border-radius: 24px; + padding: 40px; + border: 1px solid rgba(255, 255, 255, 0.2); + box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1); + position: relative; + overflow: hidden; +} + +.header-content::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: linear-gradient(45deg, rgba(255, 255, 255, 0.1) 0%, transparent 50%, rgba(255, 255, 255, 0.1) 100%); + animation: shimmer 3s ease-in-out infinite; +} + +@keyframes shimmer { + 0%, 100% { transform: translateX(-100%); } + 50% { transform: translateX(100%); } +} + +.logo { + display: flex; + align-items: center; + justify-content: center; + gap: 15px; + margin-bottom: 15px; +} + +.logo i { + font-size: 48px; + background: linear-gradient(45deg, #ff6b6b, #4ecdc4); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + animation: pulse 2s ease-in-out infinite; +} + +@keyframes pulse { + 0%, 100% { transform: scale(1); } + 50% { transform: scale(1.1); } +} + +.logo h1 { + font-size: 42px; + font-weight: 700; + color: white; + text-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); +} + +.subtitle { + font-size: 18px; + color: rgba(255, 255, 255, 0.9); + font-weight: 400; + letter-spacing: 0.5px; +} + +/* Floating Shapes */ +.header-decoration { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + pointer-events: none; + z-index: 1; +} + +.floating-shapes { + position: relative; + width: 100%; + height: 100%; +} + +.shape { + position: absolute; + border-radius: 50%; + background: linear-gradient(45deg, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0.05)); + animation: float 6s ease-in-out infinite; +} + +.shape-1 { + width: 80px; + height: 80px; + top: 10%; + left: 10%; + animation-delay: 0s; +} + +.shape-2 { + width: 60px; + height: 60px; + top: 20%; + right: 15%; + animation-delay: 2s; +} + +.shape-3 { + width: 100px; + height: 100px; + bottom: 15%; + left: 20%; + animation-delay: 4s; +} + +@keyframes float { + 0%, 100% { transform: translateY(0px) rotate(0deg); } + 33% { transform: translateY(-20px) rotate(120deg); } + 66% { transform: translateY(10px) rotate(240deg); } +} + +/* Input Section */ +.input-section { + margin-bottom: 40px; +} + +.input-card { + background: rgba(255, 255, 255, 0.95); + backdrop-filter: blur(20px); + border-radius: 20px; + padding: 30px; + box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1); + border: 1px solid rgba(255, 255, 255, 0.3); + transition: all 0.3s ease; +} + +.input-card:hover { + transform: translateY(-5px); + box-shadow: 0 30px 60px rgba(0, 0, 0, 0.15); +} + +.card-header { + display: flex; + align-items: center; + gap: 12px; + margin-bottom: 20px; +} + +.card-header i { + font-size: 24px; + color: #667eea; +} + +.card-header h2 { + font-size: 24px; + font-weight: 600; + color: #333; +} + +.input-wrapper { + position: relative; +} + +#inputText { + width: 100%; + padding: 20px; + border: 2px solid #e1e5e9; + border-radius: 12px; + font-size: 16px; + font-family: inherit; + resize: vertical; + transition: all 0.3s ease; + background: rgba(255, 255, 255, 0.8); + backdrop-filter: blur(10px); +} + +#inputText:focus { + outline: none; + border-color: #667eea; + box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1); + background: rgba(255, 255, 255, 0.95); +} + +.input-actions { + display: flex; + gap: 15px; + margin-top: 20px; + justify-content: flex-end; +} + +/* Button Styles */ +.btn { + padding: 12px 24px; + border: none; + border-radius: 10px; + font-size: 16px; + font-weight: 500; + cursor: pointer; + transition: all 0.3s ease; + display: flex; + align-items: center; + gap: 8px; + text-decoration: none; + position: relative; + overflow: hidden; +} + +.btn::before { + content: ''; + position: absolute; + top: 0; + left: -100%; + width: 100%; + height: 100%; + background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent); + transition: left 0.5s; +} + +.btn:hover::before { + left: 100%; +} + +.btn-primary { + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + color: white; + box-shadow: 0 4px 15px rgba(102, 126, 234, 0.3); +} + +.btn-primary:hover { + transform: translateY(-2px); + box-shadow: 0 8px 25px rgba(102, 126, 234, 0.4); +} + +.btn-secondary { + background: rgba(255, 255, 255, 0.8); + color: #666; + border: 1px solid #e1e5e9; +} + +.btn-secondary:hover { + background: rgba(255, 255, 255, 0.95); + transform: translateY(-2px); + box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1); +} + +/* Results Section */ +.results-section { + opacity: 0; + transform: translateY(30px); + transition: all 0.5s ease; +} + +.results-section.show { + opacity: 1; + transform: translateY(0); +} + +.results-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(400px, 1fr)); + gap: 30px; +} + +.result-card { + background: rgba(255, 255, 255, 0.95); + backdrop-filter: blur(20px); + border-radius: 20px; + padding: 30px; + box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1); + border: 1px solid rgba(255, 255, 255, 0.3); + transition: all 0.3s ease; + position: relative; + overflow: hidden; +} + +.result-card::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + height: 4px; + background: linear-gradient(90deg, #ff6b6b, #4ecdc4, #45b7d1, #96ceb4); +} + +.result-card:hover { + transform: translateY(-5px); + box-shadow: 0 30px 60px rgba(0, 0, 0, 0.15); +} + +.result-card .card-header h3 { + font-size: 20px; + font-weight: 600; + color: #333; +} + +.result-items { + display: flex; + flex-direction: column; + gap: 20px; +} + +.result-item { + position: relative; +} + +.result-item label { + display: block; + font-size: 14px; + font-weight: 500; + color: #666; + margin-bottom: 8px; + text-transform: uppercase; + letter-spacing: 0.5px; +} + +.result-value { + display: flex; + align-items: center; + background: rgba(248, 250, 252, 0.8); + border: 1px solid #e1e5e9; + border-radius: 8px; + padding: 12px 16px; + font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace; + font-size: 14px; + word-break: break-all; + position: relative; + transition: all 0.3s ease; +} + +.result-value:hover { + background: rgba(248, 250, 252, 0.95); + border-color: #667eea; +} + +.result-value .placeholder { + color: #999; + font-style: italic; +} + +.copy-btn { + background: none; + border: none; + color: #667eea; + cursor: pointer; + padding: 8px; + border-radius: 6px; + transition: all 0.3s ease; + margin-left: auto; + flex-shrink: 0; +} + +.copy-btn:hover { + background: rgba(102, 126, 234, 0.1); + color: #5a67d8; +} + +/* Loading Overlay */ +.loading-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.5); + backdrop-filter: blur(5px); + display: flex; + align-items: center; + justify-content: center; + z-index: 1000; + opacity: 0; + visibility: hidden; + transition: all 0.3s ease; +} + +.loading-overlay.show { + opacity: 1; + visibility: visible; +} + +.loading-spinner { + text-align: center; + color: white; +} + +.spinner { + width: 50px; + height: 50px; + border: 4px solid rgba(255, 255, 255, 0.3); + border-top: 4px solid white; + border-radius: 50%; + animation: spin 1s linear infinite; + margin: 0 auto 20px; +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +/* Toast Notification */ +.toast { + position: fixed; + bottom: 30px; + right: 30px; + background: linear-gradient(135deg, #4ecdc4, #44a08d); + color: white; + padding: 16px 24px; + border-radius: 12px; + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2); + display: flex; + align-items: center; + gap: 10px; + transform: translateX(400px); + transition: all 0.3s ease; + z-index: 1001; +} + +.toast.show { + transform: translateX(0); +} + +.toast i { + font-size: 18px; +} + +/* Responsive Design */ +@media (max-width: 768px) { + .container { + padding: 15px; + } + + .header-content { + padding: 30px 20px; + } + + .logo h1 { + font-size: 32px; + } + + .logo i { + font-size: 36px; + } + + .results-grid { + grid-template-columns: 1fr; + gap: 20px; + } + + .input-actions { + flex-direction: column; + } + + .btn { + justify-content: center; + } + + .toast { + bottom: 20px; + right: 20px; + left: 20px; + transform: translateY(100px); + } + + .toast.show { + transform: translateY(0); + } +} + +@media (max-width: 480px) { + .input-card, + .result-card { + padding: 20px; + } + + .card-header h2, + .card-header h3 { + font-size: 18px; + } + + .result-value { + font-size: 12px; + padding: 10px 12px; + } +} + +/* Animation Classes */ +.fade-in { + animation: fadeIn 0.5s ease-in-out; +} + +@keyframes fadeIn { + from { + opacity: 0; + transform: translateY(20px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.slide-in { + animation: slideIn 0.3s ease-out; +} + +@keyframes slideIn { + from { + transform: translateX(-20px); + opacity: 0; + } + to { + transform: translateX(0); + opacity: 1; + } +} + +/* Custom Scrollbar */ +::-webkit-scrollbar { + width: 8px; +} + +::-webkit-scrollbar-track { + background: rgba(255, 255, 255, 0.1); + border-radius: 4px; +} + +::-webkit-scrollbar-thumb { + background: rgba(255, 255, 255, 0.3); + border-radius: 4px; +} + +::-webkit-scrollbar-thumb:hover { + background: rgba(255, 255, 255, 0.5); +} \ No newline at end of file diff --git a/frontend/60sapi/实用功能/哈希解压压缩/index.html b/frontend/60sapi/实用功能/哈希解压压缩/index.html new file mode 100644 index 00000000..76cedb0f --- /dev/null +++ b/frontend/60sapi/实用功能/哈希解压压缩/index.html @@ -0,0 +1,221 @@ + + + + + + 多功能哈希工具 - Hash Toolkit + + + + + +
+ +
+
+ +

多功能哈希、编码与压缩工具

+
+
+
+
+
+
+
+
+
+ + +
+ +
+
+
+ +

输入内容

+
+
+ +
+ + +
+
+
+
+ + +
+
+ +
+
+ +

哈希算法

+
+
+
+ +
+ 等待处理... + +
+
+
+ +
+ 等待处理... + +
+
+
+ +
+ 等待处理... + +
+
+
+ +
+ 等待处理... + +
+
+
+
+ + +
+
+ +

编码转换

+
+
+
+ +
+ 等待处理... + +
+
+
+ +
+ 等待处理... + +
+
+
+ +
+ 等待处理... + +
+
+
+ +
+ 等待处理... + +
+
+
+
+ + +
+
+ +

压缩算法

+
+
+
+ +
+ 等待处理... + +
+
+
+ +
+ 等待处理... + +
+
+
+ +
+ 等待处理... + +
+
+
+ +
+ 等待处理... + +
+
+
+
+
+
+
+ + +
+
+
+

正在处理中...

+
+
+ + +
+ + 复制成功! +
+
+ + + + \ No newline at end of file diff --git a/frontend/60sapi/实用功能/哈希解压压缩/js/script.js b/frontend/60sapi/实用功能/哈希解压压缩/js/script.js new file mode 100644 index 00000000..cc8350b6 --- /dev/null +++ b/frontend/60sapi/实用功能/哈希解压压缩/js/script.js @@ -0,0 +1,380 @@ +// API配置 +const API_BASE_URL = 'https://60s.viki.moe/v2/hash'; + +// DOM元素 +const elements = { + inputText: document.getElementById('inputText'), + processBtn: document.getElementById('processBtn'), + clearBtn: document.getElementById('clearBtn'), + resultsSection: document.getElementById('resultsSection'), + loadingOverlay: document.getElementById('loadingOverlay'), + toast: document.getElementById('toast'), + toastMessage: document.getElementById('toastMessage') +}; + +// 结果元素映射 +const resultElements = { + md5: document.getElementById('md5Result'), + sha1: document.getElementById('sha1Result'), + sha256: document.getElementById('sha256Result'), + sha512: document.getElementById('sha512Result'), + base64Encode: document.getElementById('base64EncodeResult'), + base64Decode: document.getElementById('base64DecodeResult'), + urlEncode: document.getElementById('urlEncodeResult'), + urlDecode: document.getElementById('urlDecodeResult'), + gzipCompress: document.getElementById('gzipCompressResult'), + gzipDecompress: document.getElementById('gzipDecompressResult'), + deflateCompress: document.getElementById('deflateCompressResult'), + brotliCompress: document.getElementById('brotliCompressResult') +}; + +// 初始化 +document.addEventListener('DOMContentLoaded', function() { + initializeEventListeners(); + addInputAnimation(); +}); + +// 事件监听器初始化 +function initializeEventListeners() { + // 处理按钮点击 + elements.processBtn.addEventListener('click', handleProcess); + + // 清空按钮点击 + elements.clearBtn.addEventListener('click', handleClear); + + // 输入框回车键 + elements.inputText.addEventListener('keydown', function(e) { + if (e.ctrlKey && e.key === 'Enter') { + handleProcess(); + } + }); + + // 复制按钮事件委托 + document.addEventListener('click', function(e) { + if (e.target.closest('.copy-btn')) { + const copyBtn = e.target.closest('.copy-btn'); + const targetId = copyBtn.getAttribute('data-target'); + const targetElement = document.getElementById(targetId); + const textContent = targetElement.textContent.trim(); + + if (textContent && textContent !== '等待处理...' && textContent !== '处理失败') { + copyToClipboard(textContent); + } + } + }); + + // 输入框实时验证 + elements.inputText.addEventListener('input', function() { + const hasContent = this.value.trim().length > 0; + elements.processBtn.disabled = !hasContent; + + if (hasContent) { + elements.processBtn.classList.remove('disabled'); + } else { + elements.processBtn.classList.add('disabled'); + } + }); +} + +// 添加输入动画效果 +function addInputAnimation() { + elements.inputText.addEventListener('focus', function() { + this.parentElement.classList.add('focused'); + }); + + elements.inputText.addEventListener('blur', function() { + this.parentElement.classList.remove('focused'); + }); +} + +// 处理主要功能 +async function handleProcess() { + const inputValue = elements.inputText.value.trim(); + + if (!inputValue) { + showToast('请输入要处理的内容', 'error'); + return; + } + + // 显示加载状态 + showLoading(true); + resetResults(); + + try { + // 调用API + const response = await fetch(`${API_BASE_URL}?content=${encodeURIComponent(inputValue)}`); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + + const data = await response.json(); + + if (data.code === 200 && data.data) { + displayResults(data.data); + showResultsSection(); + showToast('处理完成!', 'success'); + } else { + throw new Error(data.message || '处理失败'); + } + + } catch (error) { + console.error('处理错误:', error); + showToast(`处理失败: ${error.message}`, 'error'); + displayError(); + } finally { + showLoading(false); + } +} + +// 显示结果 +function displayResults(data) { + try { + // 哈希结果 + updateResultElement('md5', data.md5 || '不可用'); + + // SHA系列 + if (data.sha) { + updateResultElement('sha1', data.sha.sha1 || '不可用'); + updateResultElement('sha256', data.sha.sha256 || '不可用'); + updateResultElement('sha512', data.sha.sha512 || '不可用'); + } + + // Base64编码 + if (data.base64) { + updateResultElement('base64Encode', data.base64.encode || '不可用'); + updateResultElement('base64Decode', data.base64.decode || '不可用'); + } + + // URL编码 + if (data.url) { + updateResultElement('urlEncode', data.url.encode || '不可用'); + updateResultElement('urlDecode', data.url.decode || '不可用'); + } + + // 压缩结果 + if (data.gzip) { + updateResultElement('gzipCompress', data.gzip.compress || '不可用'); + updateResultElement('gzipDecompress', data.gzip.decompress || '不可用'); + } + + if (data.deflate) { + updateResultElement('deflateCompress', data.deflate.compress || '不可用'); + } + + if (data.brotli) { + updateResultElement('brotliCompress', data.brotli.compress || '不可用'); + } + + } catch (error) { + console.error('显示结果时出错:', error); + showToast('显示结果时出错', 'error'); + } +} + +// 更新单个结果元素 +function updateResultElement(key, value) { + const element = resultElements[key]; + if (element) { + const textSpan = element.querySelector('span') || element; + textSpan.textContent = value; + textSpan.classList.remove('placeholder'); + + // 添加动画效果 + element.classList.add('slide-in'); + setTimeout(() => { + element.classList.remove('slide-in'); + }, 300); + } +} + +// 重置结果 +function resetResults() { + Object.values(resultElements).forEach(element => { + if (element) { + const textSpan = element.querySelector('span') || element; + textSpan.textContent = '等待处理...'; + textSpan.classList.add('placeholder'); + } + }); +} + +// 显示错误状态 +function displayError() { + Object.values(resultElements).forEach(element => { + if (element) { + const textSpan = element.querySelector('span') || element; + textSpan.textContent = '处理失败'; + textSpan.classList.add('placeholder'); + } + }); +} + +// 显示结果区域 +function showResultsSection() { + elements.resultsSection.classList.add('show'); + + // 平滑滚动到结果区域 + setTimeout(() => { + elements.resultsSection.scrollIntoView({ + behavior: 'smooth', + block: 'start' + }); + }, 100); +} + +// 清空功能 +function handleClear() { + elements.inputText.value = ''; + elements.inputText.focus(); + elements.resultsSection.classList.remove('show'); + resetResults(); + elements.processBtn.disabled = true; + elements.processBtn.classList.add('disabled'); + + showToast('内容已清空', 'info'); +} + +// 复制到剪贴板 +async function copyToClipboard(text) { + try { + if (navigator.clipboard && window.isSecureContext) { + await navigator.clipboard.writeText(text); + } else { + // 降级方案 + const textArea = document.createElement('textarea'); + textArea.value = text; + textArea.style.position = 'fixed'; + textArea.style.left = '-999999px'; + textArea.style.top = '-999999px'; + document.body.appendChild(textArea); + textArea.focus(); + textArea.select(); + document.execCommand('copy'); + textArea.remove(); + } + + showToast('复制成功!', 'success'); + } catch (error) { + console.error('复制失败:', error); + showToast('复制失败,请手动复制', 'error'); + } +} + +// 显示/隐藏加载状态 +function showLoading(show) { + if (show) { + elements.loadingOverlay.classList.add('show'); + elements.processBtn.disabled = true; + elements.processBtn.innerHTML = ' 处理中...'; + } else { + elements.loadingOverlay.classList.remove('show'); + elements.processBtn.disabled = false; + elements.processBtn.innerHTML = ' 开始处理'; + } +} + +// 显示提示消息 +function showToast(message, type = 'success') { + elements.toastMessage.textContent = message; + + // 设置图标和样式 + const icon = elements.toast.querySelector('i'); + icon.className = getToastIcon(type); + + elements.toast.className = `toast ${type}`; + elements.toast.classList.add('show'); + + // 自动隐藏 + setTimeout(() => { + elements.toast.classList.remove('show'); + }, 3000); +} + +// 获取提示图标 +function getToastIcon(type) { + const icons = { + success: 'fas fa-check-circle', + error: 'fas fa-exclamation-circle', + info: 'fas fa-info-circle', + warning: 'fas fa-exclamation-triangle' + }; + return icons[type] || icons.success; +} + +// 工具函数:防抖 +function debounce(func, wait) { + let timeout; + return function executedFunction(...args) { + const later = () => { + clearTimeout(timeout); + func(...args); + }; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + }; +} + +// 工具函数:节流 +function throttle(func, limit) { + let inThrottle; + return function() { + const args = arguments; + const context = this; + if (!inThrottle) { + func.apply(context, args); + inThrottle = true; + setTimeout(() => inThrottle = false, limit); + } + } +} + +// 添加键盘快捷键支持 +document.addEventListener('keydown', function(e) { + // Ctrl+Enter 处理 + if (e.ctrlKey && e.key === 'Enter') { + e.preventDefault(); + if (!elements.processBtn.disabled) { + handleProcess(); + } + } + + // Escape 清空 + if (e.key === 'Escape') { + handleClear(); + } +}); + +// 页面可见性变化处理 +document.addEventListener('visibilitychange', function() { + if (document.hidden) { + // 页面隐藏时的处理 + console.log('页面已隐藏'); + } else { + // 页面显示时的处理 + console.log('页面已显示'); + } +}); + +// 错误处理 +window.addEventListener('error', function(e) { + console.error('全局错误:', e.error); + showToast('发生未知错误,请刷新页面重试', 'error'); +}); + +// 未处理的Promise拒绝 +window.addEventListener('unhandledrejection', function(e) { + console.error('未处理的Promise拒绝:', e.reason); + showToast('网络请求失败,请检查网络连接', 'error'); +}); + +// 导出函数供测试使用 +if (typeof module !== 'undefined' && module.exports) { + module.exports = { + handleProcess, + copyToClipboard, + showToast, + debounce, + throttle + }; +} \ No newline at end of file diff --git a/frontend/60sapi/实用功能/哈希解压压缩/接口集合.json b/frontend/60sapi/实用功能/哈希解压压缩/接口集合.json new file mode 100644 index 00000000..547b2771 --- /dev/null +++ b/frontend/60sapi/实用功能/哈希解压压缩/接口集合.json @@ -0,0 +1,3 @@ +[ + "https://60s.api.shumengya.top" +] diff --git a/frontend/60sapi/实用功能/哈希解压压缩/返回接口.json b/frontend/60sapi/实用功能/哈希解压压缩/返回接口.json new file mode 100644 index 00000000..a6b3804b --- /dev/null +++ b/frontend/60sapi/实用功能/哈希解压压缩/返回接口.json @@ -0,0 +1,33 @@ +{ + "code": 200, + "message": "处理成功", + "data": { + "source": "你好👋", + "md5": "a1b2c3d4e5f6789012345678901234567", + "sha": { + "sha1": "da39a3ee5e6b4b0d3255bfef95601890afd80709", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "sha512": "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e" + }, + "base64": { + "encode": "5L2g5aW9", + "decode": "你好" + }, + "url": { + "encode": "%E4%BD%A0%E5%A5%BD%F0%9F%91%8B", + "decode": "你好👋" + }, + "gzip": { + "compress": "H4sIAAAAAAAAA...(压缩后的数据)", + "decompress": "你好👋" + }, + "deflate": { + "compress": "eJwrz8kvTUlMy...(压缩后的数据)", + "decompress": "你好👋" + }, + "brotli": { + "compress": "CwWAaGVsbG8g...(压缩后的数据)", + "decompress": "你好👋" + } + } +} \ No newline at end of file diff --git a/frontend/60sapi/实用功能/生成要求模板.txt b/frontend/60sapi/实用功能/生成要求模板.txt new file mode 100644 index 00000000..91b7c04d --- /dev/null +++ b/frontend/60sapi/实用功能/生成要求模板.txt @@ -0,0 +1,8 @@ +1.生成为静态网页,js,css,html分离出来,不要混合在一起放入html里,难以阅读 +2.网页要适配手机端,电脑端和平板端三个设备分别做不同的css格式,优先优化手机端用户体验 +3.网页默认风格以淡绿色清新风格为主,除非用户要求 +4.尽量不要引用外部css,js,实在要引用就使用中国国内的cdn,否则用户可能加载不出来 +5.返回接口.json储存了网页api返回的数据格式 +6.严格按照用户要求执行,不得随意添加什么注解,如“以下数据来自...” +7.接口集合.json保存了所有已知的后端API接口,一个访问不了尝试自动切换另一个 +8.在css中有关背景的css单独一个css文件,方便我直接迁移 diff --git a/frontend/60sapi/实用功能/链接OG信息/css/background.css b/frontend/60sapi/实用功能/链接OG信息/css/background.css new file mode 100644 index 00000000..27d9e571 --- /dev/null +++ b/frontend/60sapi/实用功能/链接OG信息/css/background.css @@ -0,0 +1,232 @@ +/* 高维度背景特效样式 - 神秘高级风格 */ + +/* 背景容器 */ +.background-container { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 1; + overflow: hidden; + pointer-events: none; + background: radial-gradient(ellipse at center, + rgba(15, 0, 30, 0.95) 0%, + rgba(5, 0, 15, 0.98) 50%, + rgba(0, 0, 0, 1) 100%); +} + +/* 几何网格层 */ +.geometric-grid { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-image: + linear-gradient(rgba(138, 43, 226, 0.1) 1px, transparent 1px), + linear-gradient(90deg, rgba(138, 43, 226, 0.1) 1px, transparent 1px), + linear-gradient(rgba(75, 0, 130, 0.05) 1px, transparent 1px), + linear-gradient(90deg, rgba(75, 0, 130, 0.05) 1px, transparent 1px); + background-size: 100px 100px, 100px 100px, 20px 20px, 20px 20px; + animation: gridPulse 8s ease-in-out infinite; +} + +@keyframes gridPulse { + 0%, 100% { opacity: 0.3; transform: scale(1); } + 50% { opacity: 0.6; transform: scale(1.02); } +} + +/* 神经网络效果 */ +.neural-network { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: + radial-gradient(circle at 20% 30%, rgba(138, 43, 226, 0.15) 2px, transparent 2px), + radial-gradient(circle at 80% 20%, rgba(75, 0, 130, 0.12) 1px, transparent 1px), + radial-gradient(circle at 40% 70%, rgba(147, 0, 211, 0.1) 1.5px, transparent 1.5px), + radial-gradient(circle at 90% 80%, rgba(138, 43, 226, 0.08) 1px, transparent 1px), + radial-gradient(circle at 10% 90%, rgba(75, 0, 130, 0.1) 2px, transparent 2px); + background-size: 200px 200px, 150px 150px, 300px 300px, 180px 180px, 250px 250px; + animation: neuralFlow 15s linear infinite; +} + +@keyframes neuralFlow { + 0% { transform: translate(0, 0) rotate(0deg); } + 25% { transform: translate(-10px, -5px) rotate(90deg); } + 50% { transform: translate(-5px, -10px) rotate(180deg); } + 75% { transform: translate(5px, -5px) rotate(270deg); } + 100% { transform: translate(0, 0) rotate(360deg); } +} + +/* 粒子系统 */ +.particle-system { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-image: + radial-gradient(circle, rgba(138, 43, 226, 0.4) 1px, transparent 1px), + radial-gradient(circle, rgba(75, 0, 130, 0.3) 0.5px, transparent 0.5px), + radial-gradient(circle, rgba(147, 0, 211, 0.2) 0.8px, transparent 0.8px); + background-size: 80px 80px, 120px 120px, 160px 160px; + background-position: 0 0, 40px 40px, 80px 80px; + animation: particleFloat 20s ease-in-out infinite; +} + +@keyframes particleFloat { + 0%, 100% { transform: translateY(0px) translateX(0px); } + 25% { transform: translateY(-20px) translateX(10px); } + 50% { transform: translateY(-10px) translateX(-15px); } + 75% { transform: translateY(-30px) translateX(5px); } +} + +/* 扫描线效果 */ +.scan-lines { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: repeating-linear-gradient( + 0deg, + transparent 0px, + transparent 2px, + rgba(138, 43, 226, 0.03) 2px, + rgba(138, 43, 226, 0.03) 4px + ); + animation: scanMove 3s linear infinite; +} + +@keyframes scanMove { + 0% { transform: translateY(-100%); } + 100% { transform: translateY(100%); } +} + +/* 全息投影效果 */ +.holographic-overlay { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: + linear-gradient(45deg, + transparent 30%, + rgba(138, 43, 226, 0.05) 50%, + transparent 70%), + linear-gradient(-45deg, + transparent 30%, + rgba(75, 0, 130, 0.03) 50%, + transparent 70%); + background-size: 200px 200px, 150px 150px; + animation: holographicShift 12s ease-in-out infinite; +} + +@keyframes holographicShift { + 0%, 100% { + background-position: 0% 0%, 100% 100%; + opacity: 0.7; + } + 50% { + background-position: 100% 100%, 0% 0%; + opacity: 1; + } +} + +/* 数据流效果 */ +.data-stream { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: + linear-gradient(90deg, + transparent 0%, + rgba(138, 43, 226, 0.1) 50%, + transparent 100%); + background-size: 300px 100%; + animation: dataFlow 8s linear infinite; +} + +@keyframes dataFlow { + 0% { transform: translateX(-100%); } + 100% { transform: translateX(100%); } +} + +/* 量子波动效果 */ +.quantum-waves { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: + radial-gradient(ellipse 200px 100px at 50% 0%, + rgba(138, 43, 226, 0.1) 0%, + transparent 50%), + radial-gradient(ellipse 300px 150px at 50% 100%, + rgba(75, 0, 130, 0.08) 0%, + transparent 50%); + animation: quantumPulse 10s ease-in-out infinite; +} + +@keyframes quantumPulse { + 0%, 100% { + transform: scale(1) rotate(0deg); + opacity: 0.5; + } + 50% { + transform: scale(1.1) rotate(180deg); + opacity: 0.8; + } +} + +/* 响应式优化 */ +@media (max-width: 768px) { + .geometric-grid { + background-size: 50px 50px, 50px 50px, 10px 10px, 10px 10px; + } + + .neural-network { + background-size: 100px 100px, 75px 75px, 150px 150px, 90px 90px, 125px 125px; + } + + .particle-system { + background-size: 40px 40px, 60px 60px, 80px 80px; + } +} + +/* 减少动画偏好 */ +@media (prefers-reduced-motion: reduce) { + .geometric-grid, + .neural-network, + .particle-system, + .scan-lines, + .holographic-overlay, + .data-stream, + .quantum-waves { + animation: none; + } +} + +/* 高对比度模式 */ +@media (prefers-contrast: high) { + .background-container { + background: radial-gradient(ellipse at center, + rgba(25, 0, 50, 0.95) 0%, + rgba(10, 0, 25, 0.98) 50%, + rgba(0, 0, 0, 1) 100%); + } + + .geometric-grid { + background-image: + linear-gradient(rgba(200, 100, 255, 0.2) 1px, transparent 1px), + linear-gradient(90deg, rgba(200, 100, 255, 0.2) 1px, transparent 1px); + } +} \ No newline at end of file diff --git a/frontend/60sapi/实用功能/链接OG信息/css/style.css b/frontend/60sapi/实用功能/链接OG信息/css/style.css new file mode 100644 index 00000000..e36e7c0d --- /dev/null +++ b/frontend/60sapi/实用功能/链接OG信息/css/style.css @@ -0,0 +1,1159 @@ +/* 全局样式重置 */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +/* 根变量定义 */ +:root { + /* 神秘色彩系统 */ + --primary-dark: #0a0a0a; + --secondary-dark: #1a1a1a; + --accent-dark: #2a2a2a; + --border-dark: #333333; + + /* 神秘绿色系统 */ + --neon-green: #00ff88; + --dark-green: #004d2a; + --light-green: #66ffaa; + --glow-green: rgba(0, 255, 136, 0.3); + + /* 高级紫色系统 */ + --neon-purple: #8a2be2; + --dark-purple: #4a0e4e; + --light-purple: #b347d9; + --glow-purple: rgba(138, 43, 226, 0.3); + + /* 文字颜色 */ + --text-primary: #ffffff; + --text-secondary: #cccccc; + --text-muted: #888888; + --text-accent: var(--neon-green); + + /* 间距系统 */ + --spacing-xs: 0.5rem; + --spacing-sm: 1rem; + --spacing-md: 1.5rem; + --spacing-lg: 2rem; + --spacing-xl: 3rem; + + /* 字体系统 */ + --font-primary: 'SF Pro Display', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; + --font-mono: 'SF Mono', 'Monaco', 'Cascadia Code', 'Roboto Mono', monospace; + + /* 阴影系统 */ + --shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.3); + --shadow-md: 0 4px 16px rgba(0, 0, 0, 0.4); + --shadow-lg: 0 8px 32px rgba(0, 0, 0, 0.5); + --shadow-glow: 0 0 20px var(--glow-green); + --shadow-purple-glow: 0 0 20px var(--glow-purple); + + /* 边框半径 */ + --radius-sm: 4px; + --radius-md: 8px; + --radius-lg: 12px; + --radius-xl: 16px; + + /* 过渡效果 */ + --transition-fast: 0.2s ease; + --transition-normal: 0.3s ease; + --transition-slow: 0.5s ease; +} + +/* 基础样式 */ +body { + font-family: var(--font-primary); + background: var(--primary-dark); + color: var(--text-primary); + line-height: 1.6; + overflow-x: hidden; + min-height: 100vh; + position: relative; +} + +/* 主容器 */ +.main-container { + position: relative; + z-index: 10; + min-height: 100vh; + display: flex; + flex-direction: column; + max-width: 1400px; + margin: 0 auto; + padding: var(--spacing-lg); +} + +/* 头部样式 */ +.header { + margin-bottom: var(--spacing-xl); + position: relative; +} + +.header-content { + display: flex; + justify-content: space-between; + align-items: center; + padding: var(--spacing-lg); + background: linear-gradient(135deg, var(--secondary-dark), var(--accent-dark)); + border: 1px solid var(--border-dark); + border-radius: var(--radius-xl); + backdrop-filter: blur(10px); + position: relative; + overflow: hidden; +} + +.header-content::before { + content: ''; + position: absolute; + top: 0; + left: -100%; + width: 100%; + height: 100%; + background: linear-gradient(90deg, transparent, var(--glow-green), transparent); + animation: scanLine 3s infinite; +} + +@keyframes scanLine { + 0% { left: -100%; } + 100% { left: 100%; } +} + +.logo-section { + display: flex; + align-items: center; + gap: var(--spacing-md); +} + +.logo-icon { + font-size: 2.5rem; + color: var(--neon-green); + filter: drop-shadow(0 0 10px var(--glow-green)); + animation: pulse 2s infinite; +} + +@keyframes pulse { + 0%, 100% { transform: scale(1); } + 50% { transform: scale(1.1); } +} + +.title { + font-size: 2.5rem; + font-weight: 700; + background: linear-gradient(45deg, var(--neon-green), var(--light-green)); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + text-shadow: 0 0 20px var(--glow-green); +} + +.subtitle { + font-size: 1rem; + color: var(--text-secondary); + font-family: var(--font-mono); + opacity: 0.8; +} + +.status-indicator { + display: flex; + align-items: center; + gap: var(--spacing-xs); + padding: var(--spacing-sm) var(--spacing-md); + background: rgba(0, 255, 136, 0.1); + border: 1px solid var(--neon-green); + border-radius: var(--radius-lg); + backdrop-filter: blur(5px); +} + +.pulse-dot { + width: 8px; + height: 8px; + background: var(--neon-green); + border-radius: 50%; + animation: pulseGlow 1.5s infinite; +} + +@keyframes pulseGlow { + 0%, 100% { + opacity: 1; + box-shadow: 0 0 5px var(--glow-green); + } + 50% { + opacity: 0.5; + box-shadow: 0 0 15px var(--glow-green); + } +} + +.status-text { + font-size: 0.9rem; + color: var(--neon-green); + font-family: var(--font-mono); +} + +/* 查询区域 */ +.query-section { + margin-bottom: var(--spacing-xl); +} + +.input-container { + display: flex; + gap: var(--spacing-md); + align-items: stretch; +} + +.input-wrapper { + flex: 1; + position: relative; + background: var(--secondary-dark); + border-radius: var(--radius-lg); + overflow: hidden; +} + +.input-icon { + position: absolute; + left: var(--spacing-md); + top: 50%; + transform: translateY(-50%); + color: var(--text-muted); + font-size: 1.2rem; + z-index: 2; + transition: var(--transition-normal); +} + +.url-input { + width: 100%; + padding: var(--spacing-md) var(--spacing-md) var(--spacing-md) 3.5rem; + background: transparent; + border: 2px solid var(--border-dark); + border-radius: var(--radius-lg); + color: var(--text-primary); + font-size: 1.1rem; + font-family: var(--font-mono); + transition: var(--transition-normal); + position: relative; + z-index: 1; +} + +.url-input:focus { + outline: none; + border-color: var(--neon-green); + box-shadow: var(--shadow-glow); +} + +.url-input:focus + .input-border { + opacity: 1; + animation: borderGlow 2s infinite; +} + +.url-input:focus ~ .input-icon { + color: var(--neon-green); +} + +.input-border { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + border: 2px solid var(--neon-green); + border-radius: var(--radius-lg); + opacity: 0; + pointer-events: none; + transition: var(--transition-normal); +} + +@keyframes borderGlow { + 0%, 100% { box-shadow: 0 0 5px var(--glow-green); } + 50% { box-shadow: 0 0 20px var(--glow-green); } +} + +.analyze-btn { + position: relative; + padding: var(--spacing-md) var(--spacing-xl); + background: linear-gradient(135deg, var(--dark-green), var(--neon-green)); + border: none; + border-radius: var(--radius-lg); + color: var(--primary-dark); + font-size: 1.1rem; + font-weight: 600; + cursor: pointer; + overflow: hidden; + transition: var(--transition-normal); + min-width: 150px; +} + +.analyze-btn:hover { + transform: translateY(-2px); + box-shadow: var(--shadow-glow); +} + +.analyze-btn:active { + transform: translateY(0); +} + +.btn-text { + position: relative; + z-index: 2; +} + +.btn-effects { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + pointer-events: none; +} + +.ripple { + position: absolute; + top: 50%; + left: 50%; + width: 0; + height: 0; + background: rgba(255, 255, 255, 0.3); + border-radius: 50%; + transform: translate(-50%, -50%); + transition: var(--transition-fast); +} + +.analyze-btn:active .ripple { + width: 200px; + height: 200px; +} + +/* 加载状态 */ +.loading-container { + display: flex; + justify-content: center; + align-items: center; + padding: var(--spacing-xl); + margin: var(--spacing-xl) 0; +} + +.loading-content { + text-align: center; + display: flex; + flex-direction: column; + align-items: center; + gap: var(--spacing-lg); +} + +.scanner { + position: relative; + width: 200px; + height: 200px; + border: 2px solid var(--border-dark); + border-radius: var(--radius-lg); + background: var(--secondary-dark); + overflow: hidden; +} + +.scanner-line { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 2px; + background: linear-gradient(90deg, transparent, var(--neon-green), transparent); + animation: scannerMove 2s infinite; +} + +@keyframes scannerMove { + 0% { top: 0; } + 100% { top: calc(100% - 2px); } +} + +.scanner-grid { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 1px; +} + +.grid-line { + background: var(--border-dark); + opacity: 0.3; + animation: gridPulse 1.5s infinite; +} + +.grid-line:nth-child(1) { animation-delay: 0s; } +.grid-line:nth-child(2) { animation-delay: 0.2s; } +.grid-line:nth-child(3) { animation-delay: 0.4s; } +.grid-line:nth-child(4) { animation-delay: 0.6s; } + +@keyframes gridPulse { + 0%, 100% { opacity: 0.3; } + 50% { opacity: 0.8; background: var(--glow-green); } +} + +.loading-text { + display: flex; + flex-direction: column; + gap: var(--spacing-xs); +} + +.loading-title { + font-size: 1.5rem; + font-weight: 600; + color: var(--neon-green); +} + +.loading-subtitle { + font-size: 1rem; + color: var(--text-secondary); + font-family: var(--font-mono); +} + +/* 结果展示区域 */ +.results-section { + margin-bottom: var(--spacing-xl); +} + +.results-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: var(--spacing-lg); + padding: var(--spacing-md); + background: var(--secondary-dark); + border-radius: var(--radius-lg); + border: 1px solid var(--border-dark); +} + +.results-title { + display: flex; + align-items: center; + gap: var(--spacing-sm); + font-size: 1.5rem; + font-weight: 600; + color: var(--neon-green); +} + +.results-actions { + display: flex; + gap: var(--spacing-sm); +} + +.action-btn { + display: flex; + align-items: center; + gap: var(--spacing-xs); + padding: var(--spacing-sm) var(--spacing-md); + background: var(--accent-dark); + border: 1px solid var(--border-dark); + border-radius: var(--radius-md); + color: var(--text-secondary); + font-size: 0.9rem; + cursor: pointer; + transition: var(--transition-normal); +} + +.action-btn:hover { + background: var(--border-dark); + color: var(--text-primary); + border-color: var(--neon-green); +} + +/* OG卡片 */ +.og-card { + background: var(--secondary-dark); + border: 1px solid var(--border-dark); + border-radius: var(--radius-xl); + overflow: hidden; + box-shadow: var(--shadow-lg); +} + +.info-section { + padding: var(--spacing-lg); + border-bottom: 1px solid var(--border-dark); +} + +.info-section:last-child { + border-bottom: none; +} + +.section-header { + display: flex; + align-items: center; + gap: var(--spacing-sm); + margin-bottom: var(--spacing-md); + font-size: 1.2rem; + font-weight: 600; + color: var(--text-accent); +} + +.info-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: var(--spacing-md); +} + +.info-item { + display: flex; + flex-direction: column; + gap: var(--spacing-xs); +} + +.info-item label { + font-size: 0.9rem; + color: var(--text-muted); + font-family: var(--font-mono); + text-transform: uppercase; + letter-spacing: 0.5px; +} + +.info-value { + padding: var(--spacing-sm); + background: var(--accent-dark); + border: 1px solid var(--border-dark); + border-radius: var(--radius-md); + color: var(--text-primary); + font-family: var(--font-mono); + word-break: break-all; + transition: var(--transition-normal); +} + +.info-value:hover { + border-color: var(--neon-green); + box-shadow: 0 0 10px var(--glow-green); +} + +.url-value { + color: var(--light-green); + cursor: pointer; +} + +.url-value:hover { + color: var(--neon-green); +} + +/* 媒体预览 */ +.media-preview { + margin-bottom: var(--spacing-md); + border-radius: var(--radius-lg); + overflow: hidden; + background: var(--accent-dark); + border: 1px solid var(--border-dark); + min-height: 200px; + display: flex; + align-items: center; + justify-content: center; +} + +.media-preview img { + max-width: 100%; + max-height: 300px; + object-fit: contain; + border-radius: var(--radius-md); +} + +.no-media { + display: flex; + flex-direction: column; + align-items: center; + gap: var(--spacing-sm); + color: var(--text-muted); + font-size: 1.1rem; +} + +.no-media i { + font-size: 2rem; + opacity: 0.5; +} + +.media-details { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); + gap: var(--spacing-md); +} + +/* 错误状态 */ +.error-container { + display: flex; + justify-content: center; + align-items: center; + padding: var(--spacing-xl); + margin: var(--spacing-xl) 0; +} + +.error-content { + text-align: center; + padding: var(--spacing-xl); + background: var(--secondary-dark); + border: 2px solid #ff4444; + border-radius: var(--radius-xl); + max-width: 500px; + box-shadow: 0 0 20px rgba(255, 68, 68, 0.3); +} + +.error-icon { + font-size: 3rem; + color: #ff4444; + margin-bottom: var(--spacing-md); + animation: shake 0.5s infinite; +} + +@keyframes shake { + 0%, 100% { transform: translateX(0); } + 25% { transform: translateX(-5px); } + 75% { transform: translateX(5px); } +} + +.error-title { + font-size: 1.5rem; + font-weight: 600; + color: #ff4444; + margin-bottom: var(--spacing-sm); +} + +.error-message { + color: var(--text-secondary); + margin-bottom: var(--spacing-lg); + font-family: var(--font-mono); +} + +.retry-btn { + display: inline-flex; + align-items: center; + gap: var(--spacing-xs); + padding: var(--spacing-sm) var(--spacing-lg); + background: #ff4444; + border: none; + border-radius: var(--radius-md); + color: white; + font-weight: 600; + cursor: pointer; + transition: var(--transition-normal); +} + +.retry-btn:hover { + background: #ff6666; + transform: translateY(-2px); +} + +/* Tip 消息样式 */ +.tip-container { + position: fixed; + bottom: 2rem; + left: 2rem; + z-index: 999; + opacity: 0; + transform: translateY(20px); + transition: all 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94); + pointer-events: none; +} + +.tip-container.active { + opacity: 1; + transform: translateY(0); + pointer-events: auto; +} + +.tip-content { + background: linear-gradient(135deg, + rgba(138, 43, 226, 0.1) 0%, + rgba(75, 0, 130, 0.1) 100%); + border: 1px solid rgba(138, 43, 226, 0.3); + border-radius: var(--radius-lg); + padding: var(--spacing-md); + backdrop-filter: blur(10px); + box-shadow: + 0 8px 32px rgba(0, 0, 0, 0.3), + 0 0 20px rgba(138, 43, 226, 0.1), + inset 0 1px 0 rgba(255, 255, 255, 0.1); + display: flex; + align-items: center; + gap: var(--spacing-sm); + min-width: 300px; + max-width: 400px; +} + +.tip-icon { + font-size: 1.2rem; + color: var(--neon-purple); + flex-shrink: 0; +} + +.tip-text { + color: var(--text-secondary); + font-size: 0.9rem; + line-height: 1.4; +} + +/* 提示消息 */ +.toast-container { + position: fixed; + top: var(--spacing-lg); + right: var(--spacing-lg); + z-index: 1000; + transform: translateX(100%); + transition: var(--transition-normal); +} + +.toast-container.show { + transform: translateX(0); +} + +.toast-content { + display: flex; + align-items: center; + gap: var(--spacing-sm); + padding: var(--spacing-md) var(--spacing-lg); + background: var(--secondary-dark); + border: 1px solid var(--neon-green); + border-radius: var(--radius-lg); + color: var(--text-primary); + box-shadow: var(--shadow-glow); + backdrop-filter: blur(10px); +} + +.toast-icon { + font-size: 1.2rem; + color: var(--neon-green); +} + +.toast-message { + font-family: var(--font-mono); + font-size: 0.9rem; +} + +/* 页脚 */ +.footer { + margin-top: auto; + padding: var(--spacing-lg); + border-top: 1px solid var(--border-dark); + background: var(--secondary-dark); + border-radius: var(--radius-lg); +} + +.footer-content { + display: flex; + justify-content: space-between; + align-items: center; + text-align: center; +} + +.footer-text { + display: flex; + align-items: center; + gap: var(--spacing-xs); + color: var(--text-muted); + font-size: 0.9rem; + font-family: var(--font-mono); +} + +.footer-links { + display: flex; + align-items: center; + gap: var(--spacing-sm); + font-size: 0.8rem; + color: var(--text-muted); +} + +.footer-link { + cursor: pointer; + transition: var(--transition-normal); +} + +.footer-link:hover { + color: var(--neon-green); +} + +.footer-divider { + opacity: 0.5; +} + +/* 响应式设计 */ + +/* 平板设备 */ +@media (max-width: 1024px) { + .main-container { + padding: var(--spacing-md); + } + + .header-content { + flex-direction: column; + gap: var(--spacing-md); + text-align: center; + } + + .title { + font-size: 2rem; + } + + .input-container { + flex-direction: column; + } + + .analyze-btn { + width: 100%; + } + + .info-grid { + grid-template-columns: 1fr; + } + + .results-header { + flex-direction: column; + gap: var(--spacing-md); + } + + .footer-content { + flex-direction: column; + gap: var(--spacing-sm); + } +} + +/* 交互动画增强 */ +.input-glow { + position: absolute; + top: -2px; + left: -2px; + right: -2px; + bottom: -2px; + background: linear-gradient(45deg, + var(--neon-green), + var(--light-green), + var(--neon-purple)); + border-radius: inherit; + z-index: -1; + opacity: 0; + animation: glowPulse 2s ease-in-out; +} + +@keyframes glowPulse { + 0%, 100% { opacity: 0; transform: scale(1); } + 50% { opacity: 0.6; transform: scale(1.02); } +} + +.input-container.shake { + animation: inputShake 0.6s ease-in-out; +} + +@keyframes inputShake { + 0%, 100% { transform: translateX(0); } + 10%, 30%, 50%, 70%, 90% { transform: translateX(-5px); } + 20%, 40%, 60%, 80% { transform: translateX(5px); } +} + +.analyze-btn.flash, +.action-btn.flash { + animation: buttonFlash 0.3s ease-in-out; +} + +@keyframes buttonFlash { + 0%, 100% { background: linear-gradient(135deg, var(--dark-green), var(--neon-green)); } + 50% { background: var(--neon-purple); box-shadow: 0 0 20px var(--glow-purple); } +} + +.og-card.animate-in { + animation: cardSlideIn 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94) forwards; +} + +@keyframes cardSlideIn { + 0% { + opacity: 0; + transform: translateY(30px) scale(0.95); + } + 100% { + opacity: 1; + transform: translateY(0) scale(1); + } +} + +.header.animate-in { + animation: headerFadeIn 1s ease-out forwards; +} + +@keyframes headerFadeIn { + 0% { + opacity: 0; + transform: translateY(-20px); + } + 100% { + opacity: 1; + transform: translateY(0); + } +} + +.query-section.animate-in { + animation: sectionSlideUp 0.8s ease-out 0.2s forwards; + opacity: 0; +} + +@keyframes sectionSlideUp { + 0% { + opacity: 0; + transform: translateY(40px); + } + 100% { + opacity: 1; + transform: translateY(0); + } +} + +@keyframes fadeInUp { + 0% { + opacity: 0; + transform: translateY(20px); + } + 100% { + opacity: 1; + transform: translateY(0); + } +} + +@keyframes fadeOutDown { + 0% { + opacity: 1; + transform: translateY(0); + } + 100% { + opacity: 0; + transform: translateY(20px); + } +} + +/* 高级悬浮效果 */ +.og-card:hover { + transform: translateY(-5px) scale(1.02); + box-shadow: + 0 10px 30px var(--glow-purple), + 0 0 20px rgba(138, 43, 226, 0.1), + inset 0 1px 0 rgba(255, 255, 255, 0.1); +} + +.analyze-btn:hover:not(:disabled) { + transform: translateY(-3px); + box-shadow: + 0 8px 25px var(--glow-green), + 0 0 15px rgba(0, 255, 136, 0.2); +} + +.action-btn:hover:not(:disabled) { + transform: translateY(-1px); + box-shadow: 0 5px 15px var(--glow-purple); +} + +/* 图片加载动画 */ +.media-preview img { + transition: all 0.3s ease; +} + +.media-preview img:hover { + transform: scale(1.05); + box-shadow: 0 8px 25px var(--glow-green); +} + +.image-placeholder { + background: linear-gradient(135deg, + var(--glow-green) 0%, + var(--glow-purple) 100%); + border: 2px dashed rgba(138, 43, 226, 0.3); + display: none; + align-items: center; + justify-content: center; + min-height: 200px; + border-radius: var(--radius-lg); + color: var(--text-secondary); + font-size: 0.9rem; +} + +/* 手机设备 */ +@media (max-width: 768px) { + .main-container { + padding: var(--spacing-sm); + } + + .header-content { + padding: var(--spacing-md); + } + + .title { + font-size: 1.8rem; + } + + .subtitle { + font-size: 0.9rem; + } + + .logo-icon { + font-size: 2rem; + } + + .url-input { + font-size: 16px; /* 防止iOS缩放 */ + padding: var(--spacing-sm) var(--spacing-sm) var(--spacing-sm) 3rem; + } + + .input-icon { + left: var(--spacing-sm); + font-size: 1rem; + } + + .analyze-btn { + padding: var(--spacing-sm) var(--spacing-md); + font-size: 1rem; + } + + .scanner { + width: 150px; + height: 150px; + } + + .loading-title { + font-size: 1.3rem; + } + + .loading-subtitle { + font-size: 0.9rem; + } + + .results-title { + font-size: 1.3rem; + } + + .action-btn { + font-size: 0.8rem; + padding: var(--spacing-xs) var(--spacing-sm); + } + + .info-section { + padding: var(--spacing-md); + } + + .section-header { + font-size: 1.1rem; + } + + .media-details { + grid-template-columns: 1fr; + } + + .toast-container { + top: var(--spacing-sm); + right: var(--spacing-sm); + left: var(--spacing-sm); + transform: translateY(-100%); + } + + .toast-container.show { + transform: translateY(0); + } + + .footer-text { + font-size: 0.8rem; + } + + .footer-links { + font-size: 0.7rem; + } + + /* 移动设备上禁用部分悬浮效果 */ + .og-card:hover { + transform: none; + } + + .media-preview img:hover { + transform: none; + } +} + +/* 小屏手机设备 */ +@media (max-width: 480px) { + .main-container { + padding: var(--spacing-xs); + } + + .title { + font-size: 1.5rem; + } + + .logo-section { + flex-direction: column; + gap: var(--spacing-sm); + } + + .scanner { + width: 120px; + height: 120px; + } + + .error-content { + padding: var(--spacing-md); + } + + .error-icon { + font-size: 2.5rem; + } + + .error-title { + font-size: 1.3rem; + } +} + +/* 高分辨率屏幕优化 */ +@media (min-width: 1440px) { + .main-container { + max-width: 1600px; + } + + .title { + font-size: 3rem; + } + + .url-input { + font-size: 1.2rem; + } + + .analyze-btn { + font-size: 1.2rem; + padding: var(--spacing-lg) var(--spacing-xl); + } +} + +/* 深色模式优化 */ +@media (prefers-color-scheme: dark) { + :root { + --primary-dark: #000000; + --secondary-dark: #111111; + --accent-dark: #222222; + } +} + +/* 减少动画偏好 */ +@media (prefers-reduced-motion: reduce) { + * { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + } +} + +/* 打印样式 */ +@media print { + .background-container, + .header, + .query-section, + .loading-container, + .error-container, + .toast-container, + .footer { + display: none; + } + + .results-section { + margin: 0; + padding: 0; + } + + .og-card { + border: 1px solid #000; + box-shadow: none; + } +} \ No newline at end of file diff --git a/frontend/60sapi/实用功能/链接OG信息/index.html b/frontend/60sapi/实用功能/链接OG信息/index.html new file mode 100644 index 00000000..d3251708 --- /dev/null +++ b/frontend/60sapi/实用功能/链接OG信息/index.html @@ -0,0 +1,223 @@ + + + + + + 链接OG信息查询 - 神秘解析器 + + + + + + + +
+
+
+
+
+ + +
+ +
+
+
+ +

OG 解析器

+ 链接元数据神秘解析 +
+
+
+ 系统就绪 +
+
+
+ + +
+
+
+ + +
+
+ +
+
+ + + + + + + + + +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+ + + + \ No newline at end of file diff --git a/frontend/60sapi/实用功能/链接OG信息/js/script.js b/frontend/60sapi/实用功能/链接OG信息/js/script.js new file mode 100644 index 00000000..7a25592a --- /dev/null +++ b/frontend/60sapi/实用功能/链接OG信息/js/script.js @@ -0,0 +1,555 @@ +// 链接OG信息查询 - JavaScript功能代码 +// 神秘高级风格的交互体验 + +class OGAnalyzer { + constructor() { + this.apiUrl = 'https://60s.viki.moe/v2/og'; + this.isAnalyzing = false; + this.currentUrl = ''; + this.animationFrameId = null; + + this.init(); + } + + init() { + this.bindEvents(); + this.createBackgroundEffects(); + this.initializeAnimations(); + this.showWelcomeMessage(); + this.initPageAnimations(); + } + + // 初始化页面动画 + initPageAnimations() { + // 延迟添加动画类,确保CSS已加载 + setTimeout(() => { + const header = document.querySelector('.header'); + const querySection = document.querySelector('.query-section'); + + if (header) header.classList.add('animate-in'); + if (querySection) querySection.classList.add('animate-in'); + }, 100); + } + + bindEvents() { + const urlInput = document.getElementById('url-input'); + const analyzeBtn = document.getElementById('analyze-btn'); + const copyBtn = document.getElementById('copy-btn'); + const clearBtn = document.getElementById('clear-btn'); + + // 输入框事件 + urlInput.addEventListener('input', (e) => this.handleUrlInput(e)); + urlInput.addEventListener('keypress', (e) => { + if (e.key === 'Enter' && !this.isAnalyzing) { + this.analyzeUrl(); + } + }); + urlInput.addEventListener('focus', () => this.handleInputFocus()); + urlInput.addEventListener('blur', () => this.handleInputBlur()); + + // 按钮事件 + analyzeBtn.addEventListener('click', () => this.analyzeUrl()); + copyBtn.addEventListener('click', () => this.copyResults()); + clearBtn.addEventListener('click', () => this.clearResults()); + + // 键盘快捷键 + document.addEventListener('keydown', (e) => this.handleKeyboard(e)); + } + + handleUrlInput(e) { + const url = e.target.value.trim(); + const analyzeBtn = document.getElementById('analyze-btn'); + + if (this.isValidUrl(url)) { + analyzeBtn.classList.add('ready'); + e.target.classList.remove('error'); + } else { + analyzeBtn.classList.remove('ready'); + if (url.length > 0) { + e.target.classList.add('error'); + } else { + e.target.classList.remove('error'); + } + } + } + + handleInputFocus() { + const inputContainer = document.querySelector('.input-container'); + inputContainer.classList.add('focused'); + this.createInputGlow(); + } + + handleInputBlur() { + const inputContainer = document.querySelector('.input-container'); + inputContainer.classList.remove('focused'); + } + + handleKeyboard(e) { + // Ctrl/Cmd + Enter 快速分析 + if ((e.ctrlKey || e.metaKey) && e.key === 'Enter') { + e.preventDefault(); + if (!this.isAnalyzing) { + this.analyzeUrl(); + } + } + + // Escape 清除结果 + if (e.key === 'Escape') { + this.clearResults(); + } + } + + isValidUrl(string) { + try { + const url = new URL(string); + return url.protocol === 'http:' || url.protocol === 'https:'; + } catch (_) { + return false; + } + } + + async analyzeUrl() { + const urlInput = document.getElementById('url-input'); + const url = urlInput.value.trim(); + + if (!this.isValidUrl(url)) { + this.showError('请输入有效的URL地址'); + this.shakeInput(); + return; + } + + if (this.isAnalyzing) { + return; + } + + this.currentUrl = url; + this.isAnalyzing = true; + this.showLoading(); + this.hideError(); + this.hideResults(); + + try { + const response = await fetch(`${this.apiUrl}?url=${encodeURIComponent(url)}`); + + if (!response.ok) { + throw new Error(`HTTP ${response.status}: ${response.statusText}`); + } + + const data = await response.json(); + + if (data.code === 200 && data.data) { + await this.displayResults(data.data); + this.showSuccessMessage('分析完成!'); + + // 添加按钮闪烁效果 + const analyzeBtn = document.getElementById('analyze-btn'); + analyzeBtn.classList.add('flash'); + setTimeout(() => { + analyzeBtn.classList.remove('flash'); + }, 300); + } else { + throw new Error(data.message || '获取OG信息失败'); + } + } catch (error) { + console.error('分析失败:', error); + this.showError(`分析失败: ${error.message}`); + } finally { + this.isAnalyzing = false; + this.hideLoading(); + } + } + + showLoading() { + const loadingElement = document.getElementById('loading'); + const analyzeBtn = document.getElementById('analyze-btn'); + + loadingElement.classList.add('active'); + analyzeBtn.disabled = true; + analyzeBtn.textContent = '分析中...'; + + this.startScannerAnimation(); + } + + hideLoading() { + const loadingElement = document.getElementById('loading'); + const analyzeBtn = document.getElementById('analyze-btn'); + + loadingElement.classList.remove('active'); + analyzeBtn.disabled = false; + analyzeBtn.textContent = '开始分析'; + + this.stopScannerAnimation(); + } + + async displayResults(data) { + const resultsElement = document.getElementById('results'); + const ogCard = document.getElementById('og-card'); + + // 基础信息 + this.updateElement('og-title', data.title || '未获取到标题'); + this.updateElement('og-description', data.description || '未获取到描述'); + this.updateElement('og-url', data.url || this.currentUrl); + this.updateElement('og-site-name', data.site_name || '未知站点'); + this.updateElement('og-type', data.type || 'website'); + + // 媒体信息 + this.updateImageElement('og-image', data.image); + this.updateElement('og-image-alt', data.image_alt || '图片描述不可用'); + + // 技术信息 + this.updateElement('og-locale', data.locale || '未指定'); + this.updateElement('og-updated-time', this.formatDate(data.updated_time)); + this.updateElement('response-time', `${Date.now() - this.startTime}ms`); + + // 显示结果 + resultsElement.classList.add('active'); + + // 添加动画效果 + await this.animateResults(); + + // 启用操作按钮 + document.getElementById('copy-btn').disabled = false; + document.getElementById('clear-btn').disabled = false; + } + + updateElement(id, content) { + const element = document.getElementById(id); + if (element) { + element.textContent = content; + } + } + + updateImageElement(id, imageSrc) { + const element = document.getElementById(id); + if (element && imageSrc) { + element.src = imageSrc; + element.style.display = 'block'; + element.onerror = () => { + element.style.display = 'none'; + const placeholder = element.nextElementSibling; + if (placeholder && placeholder.classList.contains('image-placeholder')) { + placeholder.style.display = 'flex'; + } + }; + } else if (element) { + element.style.display = 'none'; + const placeholder = element.nextElementSibling; + if (placeholder && placeholder.classList.contains('image-placeholder')) { + placeholder.style.display = 'flex'; + } + } + } + + formatDate(timestamp) { + if (!timestamp) return '未知'; + try { + const date = new Date(timestamp); + return date.toLocaleString('zh-CN'); + } catch (e) { + return '格式错误'; + } + } + + async animateResults() { + const cards = document.querySelectorAll('.info-card'); + + for (let i = 0; i < cards.length; i++) { + setTimeout(() => { + cards[i].classList.add('animate-in'); + }, i * 100); + } + + // 等待动画完成 + await new Promise(resolve => setTimeout(resolve, cards.length * 100 + 300)); + } + + showError(message) { + const errorElement = document.getElementById('error-message'); + const errorText = errorElement.querySelector('.error-text'); + const inputContainer = document.querySelector('.input-container'); + + errorText.textContent = message; + errorElement.classList.add('active'); + + // 添加震动效果 + if (inputContainer) { + inputContainer.classList.add('shake'); + setTimeout(() => { + inputContainer.classList.remove('shake'); + }, 600); + } + + // 自动隐藏错误信息 + setTimeout(() => { + this.hideError(); + }, 5000); + } + + hideError() { + const errorElement = document.getElementById('error-message'); + errorElement.classList.remove('active'); + } + + hideResults() { + const resultsElement = document.getElementById('results'); + resultsElement.classList.remove('active'); + + // 重置动画状态 + const cards = document.querySelectorAll('.info-card'); + cards.forEach(card => card.classList.remove('animate-in')); + } + + showSuccessMessage(message) { + const tipElement = document.getElementById('tip-message'); + const tipText = tipElement.querySelector('.tip-text'); + + tipText.textContent = message; + tipElement.classList.add('active'); + + setTimeout(() => { + tipElement.classList.remove('active'); + }, 3000); + } + + shakeInput() { + const inputContainer = document.querySelector('.input-container'); + inputContainer.classList.add('shake'); + + setTimeout(() => { + inputContainer.classList.remove('shake'); + }, 600); + } + + copyResults() { + const ogData = { + title: document.getElementById('og-title').textContent, + description: document.getElementById('og-description').textContent, + url: document.getElementById('og-url').textContent, + site_name: document.getElementById('og-site-name').textContent, + type: document.getElementById('og-type').textContent, + image: document.getElementById('og-image').src, + locale: document.getElementById('og-locale').textContent + }; + + const jsonString = JSON.stringify(ogData, null, 2); + + navigator.clipboard.writeText(jsonString).then(() => { + this.showSuccessMessage('结果已复制到剪贴板!'); + this.flashCopyButton(); + }).catch(err => { + console.error('复制失败:', err); + this.showError('复制失败,请手动选择内容'); + }); + } + + flashCopyButton() { + const copyBtn = document.getElementById('copy-btn'); + copyBtn.classList.add('flash'); + + setTimeout(() => { + copyBtn.classList.remove('flash'); + }, 300); + } + + clearResults() { + const urlInput = document.getElementById('url-input'); + const resultsElement = document.getElementById('results'); + const errorElement = document.getElementById('error-message'); + + urlInput.value = ''; + urlInput.classList.remove('error'); + resultsElement.classList.remove('active'); + errorElement.classList.remove('active'); + + document.getElementById('analyze-btn').classList.remove('ready'); + document.getElementById('copy-btn').disabled = true; + document.getElementById('clear-btn').disabled = true; + + this.currentUrl = ''; + + // 重置动画状态 + const cards = document.querySelectorAll('.info-card'); + cards.forEach(card => card.classList.remove('animate-in')); + + this.showSuccessMessage('已清除所有内容'); + } + + createBackgroundEffects() { + const container = document.querySelector('.background-container'); + + // 创建各种背景效果层 + const effects = [ + 'geometric-grid', + 'neural-network', + 'particle-system', + 'scan-lines', + 'holographic-overlay', + 'data-stream', + 'quantum-waves' + ]; + + effects.forEach(effectClass => { + const layer = document.createElement('div'); + layer.className = effectClass; + container.appendChild(layer); + }); + } + + createInputGlow() { + const inputContainer = document.querySelector('.input-container'); + + // 创建光晕效果 + const glow = document.createElement('div'); + glow.className = 'input-glow'; + inputContainer.appendChild(glow); + + setTimeout(() => { + if (glow.parentNode) { + glow.remove(); + } + }, 2000); + } + + startScannerAnimation() { + const scanner = document.querySelector('.scanner'); + if (scanner) { + scanner.classList.add('active'); + } + } + + stopScannerAnimation() { + const scanner = document.querySelector('.scanner'); + if (scanner) { + scanner.classList.remove('active'); + } + } + + initializeAnimations() { + // 初始化页面动画 + const header = document.querySelector('.header'); + const querySection = document.querySelector('.query-section'); + + setTimeout(() => { + header.classList.add('animate-in'); + }, 100); + + setTimeout(() => { + querySection.classList.add('animate-in'); + }, 300); + } + + showWelcomeMessage() { + const tips = [ + '支持分析网页的标题、描述、图片等元信息', + '可以预览社交媒体分享时的显示效果', + '检测网页的SEO优化情况', + '分析Open Graph协议标签' + ]; + + setTimeout(() => { + this.showSuccessMessage('欢迎使用链接OG信息分析器!'); + }, 1000); + + // 显示提示信息 + this.showTips(tips); + } + + // 显示提示信息 + showTips(tips) { + const tipElement = document.getElementById('tip-message'); + const tipText = tipElement.querySelector('.tip-text'); + + let currentTip = 0; + + const showNextTip = () => { + tipText.textContent = tips[currentTip]; + tipElement.classList.add('active'); + tipElement.style.animation = 'fadeInUp 0.5s ease-out'; + + setTimeout(() => { + tipElement.style.animation = 'fadeOutDown 0.5s ease-in'; + setTimeout(() => { + tipElement.classList.remove('active'); + currentTip = (currentTip + 1) % tips.length; + }, 500); + }, 3000); + }; + + // 首次显示 + setTimeout(showNextTip, 2000); + + // 每8秒显示一次 + setInterval(showNextTip, 8000); + } +} + +// 工具函数 +function debounce(func, wait) { + let timeout; + return function executedFunction(...args) { + const later = () => { + clearTimeout(timeout); + func(...args); + }; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + }; +} + +function throttle(func, limit) { + let inThrottle; + return function() { + const args = arguments; + const context = this; + if (!inThrottle) { + func.apply(context, args); + inThrottle = true; + setTimeout(() => inThrottle = false, limit); + } + } +} + +// 页面加载完成后初始化 +document.addEventListener('DOMContentLoaded', () => { + // 检查必要的DOM元素 + const requiredElements = [ + 'url-input', 'analyze-btn', 'copy-btn', 'clear-btn', + 'loading', 'results', 'error-message', 'tip-message' + ]; + + const missingElements = requiredElements.filter(id => !document.getElementById(id)); + + if (missingElements.length > 0) { + console.error('缺少必要的DOM元素:', missingElements); + return; + } + + // 初始化应用 + window.ogAnalyzer = new OGAnalyzer(); + + // 添加全局错误处理 + window.addEventListener('error', (e) => { + console.error('全局错误:', e.error); + if (window.ogAnalyzer) { + window.ogAnalyzer.showError('发生未知错误,请刷新页面重试'); + } + }); + + // 添加网络状态监听 + window.addEventListener('online', () => { + if (window.ogAnalyzer) { + window.ogAnalyzer.showSuccessMessage('网络连接已恢复'); + } + }); + + window.addEventListener('offline', () => { + if (window.ogAnalyzer) { + window.ogAnalyzer.showError('网络连接已断开'); + } + }); +}); + +// 导出给其他模块使用 +if (typeof module !== 'undefined' && module.exports) { + module.exports = { OGAnalyzer, debounce, throttle }; +} \ No newline at end of file diff --git a/frontend/60sapi/实用功能/链接OG信息/接口集合.json b/frontend/60sapi/实用功能/链接OG信息/接口集合.json new file mode 100644 index 00000000..547b2771 --- /dev/null +++ b/frontend/60sapi/实用功能/链接OG信息/接口集合.json @@ -0,0 +1,3 @@ +[ + "https://60s.api.shumengya.top" +] diff --git a/frontend/60sapi/实用功能/链接OG信息/返回接口.json b/frontend/60sapi/实用功能/链接OG信息/返回接口.json new file mode 100644 index 00000000..de8516ab --- /dev/null +++ b/frontend/60sapi/实用功能/链接OG信息/返回接口.json @@ -0,0 +1,66 @@ +{ + "code": 200, + "message": "success", + "data": { + "url": "https://example.com", + "title": "示例网站标题", + "description": "这是一个示例网站的描述信息,用于展示OG标签解析功能。", + "image": "https://example.com/og-image.jpg", + "site_name": "示例网站", + "type": "website", + "locale": "zh_CN", + "author": "网站作者", + "keywords": "示例,网站,OG标签,元数据", + "favicon": "https://example.com/favicon.ico", + "canonical_url": "https://example.com", + "robots": "index,follow", + "viewport": "width=device-width, initial-scale=1.0", + "charset": "UTF-8", + "language": "zh-CN", + "published_time": "2024-01-01T00:00:00Z", + "modified_time": "2024-01-15T12:30:00Z", + "section": "技术", + "tags": ["前端", "元数据", "SEO"], + "twitter": { + "card": "summary_large_image", + "site": "@example", + "creator": "@author", + "title": "Twitter标题", + "description": "Twitter描述", + "image": "https://example.com/twitter-image.jpg" + }, + "facebook": { + "app_id": "123456789", + "admins": "987654321" + }, + "structured_data": { + "@context": "https://schema.org", + "@type": "WebPage", + "name": "示例网页", + "description": "示例网页描述", + "url": "https://example.com" + }, + "meta_tags": { + "generator": "WordPress 6.0", + "theme-color": "#000000", + "msapplication-TileColor": "#ffffff", + "apple-mobile-web-app-capable": "yes", + "apple-mobile-web-app-status-bar-style": "default" + }, + "performance": { + "load_time": 1.25, + "page_size": "2.3MB", + "requests_count": 45 + }, + "seo_score": { + "overall": 85, + "title_score": 90, + "description_score": 80, + "image_score": 85, + "structure_score": 88 + } + }, + "timestamp": "2024-01-15T12:30:45Z", + "request_id": "req_123456789", + "processing_time": 0.85 +} \ No newline at end of file From cca1a969c5daae9e0cb20917ed223d748a818167 Mon Sep 17 00:00:00 2001 From: HcpY <3541908431@qq.com> Date: Thu, 4 Sep 2025 13:36:00 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E9=83=A8=E5=88=86api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/60sapi/娱乐消遣/随机KFC文案/js/main.js | 4 ++-- frontend/60sapi/娱乐消遣/随机KFC文案/返回接口.json | 9 ++++++++- frontend/60sapi/娱乐消遣/随机一言/js/script.js | 9 +++------ 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/frontend/60sapi/娱乐消遣/随机KFC文案/js/main.js b/frontend/60sapi/娱乐消遣/随机KFC文案/js/main.js index 526c4750..353209f9 100644 --- a/frontend/60sapi/娱乐消遣/随机KFC文案/js/main.js +++ b/frontend/60sapi/娱乐消遣/随机KFC文案/js/main.js @@ -17,8 +17,8 @@ class KFCGenerator { // 加载API接口列表 async loadApiEndpoints() { try { - const response = await fetch('./接口集合.json'); - this.apiEndpoints = await response.json(); + // 直接硬编码API端点,避免CORS问题 + this.apiEndpoints = ["https://60s.api.shumengya.top"]; } catch (error) { console.error('加载API接口列表失败:', error); this.showToast('加载接口配置失败', 'error'); diff --git a/frontend/60sapi/娱乐消遣/随机KFC文案/返回接口.json b/frontend/60sapi/娱乐消遣/随机KFC文案/返回接口.json index 0f729ba8..1e04caca 100644 --- a/frontend/60sapi/娱乐消遣/随机KFC文案/返回接口.json +++ b/frontend/60sapi/娱乐消遣/随机KFC文案/返回接口.json @@ -1 +1,8 @@ -{"code":200,"message":"获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841","data":{"index":369,"kfc":"我不想你带着情绪过夜,这样会把你推的越来越远,我不想你离开我,我希望你可以多爱我一点,我不想因为一点点小问题就让我们两之间的感情产生隔阂。对我来说,双向奔赴的感情相处才有意义,看不到希望的事情我没办法坚持太久,我不想浪费时间在一些无意义无结果的事情上,时间应该用来做我该做的事情。很多人走不到最后,是因为理解不同步,但我跟你在一起,我知道你什样的人,我了解你甚至比了解自己还多,我和你在一起,不是因为其他,而是因为今天肯德基疯狂星期四,我希望你能请我吃!"}} \ No newline at end of file +{ + "code": 200, + "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", + "data": { + "index": 78, + "kfc": "我叫夯大力 立冬给我准备了糖炒栗子了没有 没准备的自动绝交 再 v 我 50 吃疯狂星期四 然后再给我点杯奶茶 再给我两万块钱 懂吗你们" + } +} \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机一言/js/script.js b/frontend/60sapi/娱乐消遣/随机一言/js/script.js index 5ce4546a..cd62af76 100644 --- a/frontend/60sapi/娱乐消遣/随机一言/js/script.js +++ b/frontend/60sapi/娱乐消遣/随机一言/js/script.js @@ -4,11 +4,7 @@ class HitokotoApp { constructor() { // API接口列表 this.apiEndpoints = [ - "https://60s-cf.viki.moe", - "https://60s.viki.moe", - "https://60s.b23.run", - "https://60s.114128.xyz", - "https://60s-cf.114128.xyz" + "https://60s.api.shumengya.top" ]; this.currentEndpointIndex = 0; @@ -117,7 +113,8 @@ class HitokotoApp { const timeoutId = setTimeout(() => controller.abort(), 10000); // 10秒超时 try { - const response = await fetch(`${endpoint}/v2/hitokoto?encoding=text`, { + // 移除URL中的encoding=text参数,确保返回JSON格式 + const response = await fetch(`${endpoint}/v2/hitokoto`, { method: 'GET', headers: { 'Accept': 'application/json', From eb13979d4d31ccab728fbbbb32bdf91f56e01859 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A0=91=E8=90=8C=E8=8A=BD?= <3205788256@qq.com> Date: Thu, 4 Sep 2025 13:38:14 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E9=83=A8=E5=88=86=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- QQEmailSendAPI.py | 543 -- backend/app.py | 62 +- backend/modules/aimodelapp.py | 78 + backend/modules/api_60s.py | 325 +- backend/modules/auth.py | 8 +- backend/modules/smallgame.py | 78 + frontend/aimodelapp/AI写诗小助手/index.html | 335 + frontend/aimodelapp/AI变量命名助手/index.html | 42 + frontend/aimodelapp/AI变量命名助手/script.js | 305 + frontend/aimodelapp/AI变量命名助手/styles.css | 365 ++ frontend/aimodelapp/AI姓名评测/index.html | 56 + frontend/aimodelapp/AI姓名评测/script.js | 291 + frontend/aimodelapp/AI姓名评测/styles.css | 249 + frontend/aimodelapp/生成要求.txt | 12 + .../随机JavaScript趣味题/css/background.css | 190 - .../随机JavaScript趣味题/css/style.css | 597 -- .../娱乐消遣/随机JavaScript趣味题/index.html | 89 - .../随机JavaScript趣味题/js/script.js | 565 -- .../随机JavaScript趣味题/接口集合.json | 7 - .../随机JavaScript趣味题/返回接口.json | 17 - .../娱乐消遣/随机KFC文案/css/background.css | 81 - .../60sapi/娱乐消遣/随机KFC文案/css/style.css | 339 - .../60sapi/娱乐消遣/随机KFC文案/index.html | 46 - .../60sapi/娱乐消遣/随机KFC文案/js/main.js | 240 - .../60sapi/娱乐消遣/随机KFC文案/接口集合.json | 7 - .../60sapi/娱乐消遣/随机KFC文案/返回接口.json | 1 - .../娱乐消遣/随机一言/css/background.css | 167 - .../60sapi/娱乐消遣/随机一言/css/style.css | 357 -- .../60sapi/娱乐消遣/随机一言/index.html | 52 - .../60sapi/娱乐消遣/随机一言/js/script.js | 225 - .../60sapi/娱乐消遣/随机一言/接口集合.json | 7 - .../60sapi/娱乐消遣/随机一言/返回接口.json | 8 - .../娱乐消遣/随机唱歌音频/css/style.css | 251 - .../60sapi/娱乐消遣/随机唱歌音频/index.html | 67 - .../60sapi/娱乐消遣/随机唱歌音频/js/script.js | 252 - .../娱乐消遣/随机唱歌音频/接口集合.json | 7 - .../娱乐消遣/随机唱歌音频/返回接口.json | 32 - .../实用功能/EpicGames免费游戏/css/style.css | 330 - .../实用功能/EpicGames免费游戏/index.html | 63 - .../实用功能/EpicGames免费游戏/js/script.js | 266 - .../实用功能/EpicGames免费游戏/接口集合.json | 7 - .../实用功能/EpicGames免费游戏/返回接口.json | 66 - .../实用功能/农历信息/css/background.css | 89 - .../60sapi/实用功能/农历信息/css/style.css | 1105 ---- .../60sapi/实用功能/农历信息/index.html | 71 - .../60sapi/实用功能/农历信息/js/script.js | 485 -- .../60sapi/实用功能/农历信息/接口集合.json | 7 - .../60sapi/实用功能/农历信息/返回接口.json | 647 -- .../实用功能/实时天气/css/background.css | 145 - .../60sapi/实用功能/实时天气/css/style.css | 409 -- .../60sapi/实用功能/实时天气/index.html | 140 - .../60sapi/实用功能/实时天气/js/script.js | 252 - .../60sapi/实用功能/实时天气/接口集合.json | 7 - .../60sapi/实用功能/实时天气/返回接口.json | 68 - .../实用功能/生成二维码/css/background.css | 132 - .../60sapi/实用功能/生成二维码/css/style.css | 468 -- .../60sapi/实用功能/生成二维码/index.html | 98 - .../60sapi/实用功能/生成二维码/js/script.js | 417 -- .../60sapi/实用功能/生成二维码/接口集合.json | 7 - .../60sapi/实用功能/生成二维码/返回接口.json | 10 - .../实用功能/百度百科词条/css/background.css | 192 - .../实用功能/百度百科词条/css/style.css | 530 -- .../60sapi/实用功能/百度百科词条/index.html | 83 - .../60sapi/实用功能/百度百科词条/js/script.js | 324 - .../实用功能/百度百科词条/接口集合.json | 7 - .../实用功能/百度百科词条/返回接口.json | 12 - .../日更资讯/历史上的今天/css/style.css | 388 -- .../60sapi/日更资讯/历史上的今天/index.html | 83 - .../60sapi/日更资讯/历史上的今天/js/script.js | 295 - .../日更资讯/历史上的今天/接口集合.json | 7 - .../日更资讯/历史上的今天/返回接口.json | 102 - .../日更资讯/必应每日壁纸/css/style.css | 326 - .../60sapi/日更资讯/必应每日壁纸/index.html | 42 - .../60sapi/日更资讯/必应每日壁纸/js/script.js | 315 - .../日更资讯/必应每日壁纸/接口集合.json | 7 - .../日更资讯/必应每日壁纸/返回接口.json | 15 - .../日更资讯/每天60s读懂世界/css/style.css | 327 - .../日更资讯/每天60s读懂世界/index.html | 49 - .../日更资讯/每天60s读懂世界/js/script.js | 305 - .../日更资讯/每天60s读懂世界/接口集合.json | 7 - .../日更资讯/每天60s读懂世界/返回接口.json | 66 - .../日更资讯/每日国际汇率/css/style.css | 409 -- .../60sapi/日更资讯/每日国际汇率/index.html | 86 - .../60sapi/日更资讯/每日国际汇率/js/script.js | 520 -- .../日更资讯/每日国际汇率/接口集合.json | 7 - .../日更资讯/每日国际汇率/返回接口.json | 1 - .../HackerNews榜单/css/background.css | 106 - .../热搜榜单/HackerNews榜单/css/style.css | 1037 --- .../60sapi/热搜榜单/HackerNews榜单/index.html | 77 - .../热搜榜单/HackerNews榜单/js/script.js | 338 - .../热搜榜单/HackerNews榜单/接口集合.json | 7 - .../热搜榜单/HackerNews榜单/返回接口.json | 87 - .../热搜榜单/微博热搜榜/css/background.css | 40 - .../60sapi/热搜榜单/微博热搜榜/css/style.css | 155 - .../60sapi/热搜榜单/微博热搜榜/index.html | 34 - .../60sapi/热搜榜单/微博热搜榜/js/main.js | 94 - .../60sapi/热搜榜单/微博热搜榜/接口集合.json | 7 - .../60sapi/热搜榜单/微博热搜榜/返回接口.json | 261 - .../热搜榜单/抖音热搜榜/css/background.css | 52 - .../60sapi/热搜榜单/抖音热搜榜/css/style.css | 956 --- .../60sapi/热搜榜单/抖音热搜榜/index.html | 60 - .../60sapi/热搜榜单/抖音热搜榜/js/script.js | 300 - .../60sapi/热搜榜单/抖音热搜榜/接口集合.json | 7 - .../60sapi/热搜榜单/抖音热搜榜/返回接口.json | 496 -- .../热搜榜单/猫眼票房排行榜/css/style.css | 495 -- .../60sapi/热搜榜单/猫眼票房排行榜/index.html | 40 - .../热搜榜单/猫眼票房排行榜/js/script.js | 249 - .../热搜榜单/猫眼票房排行榜/接口集合.json | 7 - .../热搜榜单/猫眼票房排行榜/返回接口.json | 171 - .../热搜榜单/网易云榜单列表/接口集合.json | 7 - .../热搜榜单/网易云榜单列表/返回接口.json | 750 --- .../网易云榜单详情/css/background.css | 123 - .../热搜榜单/网易云榜单详情/css/style.css | 483 -- .../60sapi/热搜榜单/网易云榜单详情/index.html | 69 - .../热搜榜单/网易云榜单详情/js/script.js | 349 - .../热搜榜单/网易云榜单详情/接口集合.json | 7 - .../热搜榜单/网易云榜单详情/返回接口.json | 5612 ----------------- .../react-app/public/60sapi/生成要求模板.txt | 8 - frontend/react-app/public/index.html | 6 +- frontend/react-app/src/components/Header.js | 14 +- frontend/react-app/src/pages/AiModelPage.js | 370 +- frontend/react-app/src/pages/Api60sPage.js | 7 +- frontend/react-app/src/pages/SmallGamePage.js | 350 +- frontend/smallgame/2048/controls.js | 537 ++ frontend/smallgame/2048/game-logic.js | 424 ++ frontend/smallgame/2048/index.html | 165 + frontend/smallgame/2048/statistics.js | 381 ++ frontend/smallgame/2048/styles.css | 611 ++ .../smallgame/俄罗斯方块/game-controls.js | 279 + frontend/smallgame/俄罗斯方块/game-stats.js | 338 + frontend/smallgame/俄罗斯方块/index.html | 124 + frontend/smallgame/俄罗斯方块/styles.css | 459 ++ frontend/smallgame/俄罗斯方块/tetris.js | 521 ++ frontend/smallgame/别踩白方块/MUSIC.mp3 | Bin 0 -> 3150505 bytes frontend/smallgame/别踩白方块/game.js | 339 + frontend/smallgame/别踩白方块/index.html | 251 + frontend/smallgame/生成要求.txt | 6 + 137 files changed, 6848 insertions(+), 26965 deletions(-) delete mode 100644 QQEmailSendAPI.py create mode 100644 backend/modules/aimodelapp.py create mode 100644 backend/modules/smallgame.py create mode 100644 frontend/aimodelapp/AI写诗小助手/index.html create mode 100644 frontend/aimodelapp/AI变量命名助手/index.html create mode 100644 frontend/aimodelapp/AI变量命名助手/script.js create mode 100644 frontend/aimodelapp/AI变量命名助手/styles.css create mode 100644 frontend/aimodelapp/AI姓名评测/index.html create mode 100644 frontend/aimodelapp/AI姓名评测/script.js create mode 100644 frontend/aimodelapp/AI姓名评测/styles.css create mode 100644 frontend/aimodelapp/生成要求.txt delete mode 100644 frontend/react-app/public/60sapi/娱乐消遣/随机JavaScript趣味题/css/background.css delete mode 100644 frontend/react-app/public/60sapi/娱乐消遣/随机JavaScript趣味题/css/style.css delete mode 100644 frontend/react-app/public/60sapi/娱乐消遣/随机JavaScript趣味题/index.html delete mode 100644 frontend/react-app/public/60sapi/娱乐消遣/随机JavaScript趣味题/js/script.js delete mode 100644 frontend/react-app/public/60sapi/娱乐消遣/随机JavaScript趣味题/接口集合.json delete mode 100644 frontend/react-app/public/60sapi/娱乐消遣/随机JavaScript趣味题/返回接口.json delete mode 100644 frontend/react-app/public/60sapi/娱乐消遣/随机KFC文案/css/background.css delete mode 100644 frontend/react-app/public/60sapi/娱乐消遣/随机KFC文案/css/style.css delete mode 100644 frontend/react-app/public/60sapi/娱乐消遣/随机KFC文案/index.html delete mode 100644 frontend/react-app/public/60sapi/娱乐消遣/随机KFC文案/js/main.js delete mode 100644 frontend/react-app/public/60sapi/娱乐消遣/随机KFC文案/接口集合.json delete mode 100644 frontend/react-app/public/60sapi/娱乐消遣/随机KFC文案/返回接口.json delete mode 100644 frontend/react-app/public/60sapi/娱乐消遣/随机一言/css/background.css delete mode 100644 frontend/react-app/public/60sapi/娱乐消遣/随机一言/css/style.css delete mode 100644 frontend/react-app/public/60sapi/娱乐消遣/随机一言/index.html delete mode 100644 frontend/react-app/public/60sapi/娱乐消遣/随机一言/js/script.js delete mode 100644 frontend/react-app/public/60sapi/娱乐消遣/随机一言/接口集合.json delete mode 100644 frontend/react-app/public/60sapi/娱乐消遣/随机一言/返回接口.json delete mode 100644 frontend/react-app/public/60sapi/娱乐消遣/随机唱歌音频/css/style.css delete mode 100644 frontend/react-app/public/60sapi/娱乐消遣/随机唱歌音频/index.html delete mode 100644 frontend/react-app/public/60sapi/娱乐消遣/随机唱歌音频/js/script.js delete mode 100644 frontend/react-app/public/60sapi/娱乐消遣/随机唱歌音频/接口集合.json delete mode 100644 frontend/react-app/public/60sapi/娱乐消遣/随机唱歌音频/返回接口.json delete mode 100644 frontend/react-app/public/60sapi/实用功能/EpicGames免费游戏/css/style.css delete mode 100644 frontend/react-app/public/60sapi/实用功能/EpicGames免费游戏/index.html delete mode 100644 frontend/react-app/public/60sapi/实用功能/EpicGames免费游戏/js/script.js delete mode 100644 frontend/react-app/public/60sapi/实用功能/EpicGames免费游戏/接口集合.json delete mode 100644 frontend/react-app/public/60sapi/实用功能/EpicGames免费游戏/返回接口.json delete mode 100644 frontend/react-app/public/60sapi/实用功能/农历信息/css/background.css delete mode 100644 frontend/react-app/public/60sapi/实用功能/农历信息/css/style.css delete mode 100644 frontend/react-app/public/60sapi/实用功能/农历信息/index.html delete mode 100644 frontend/react-app/public/60sapi/实用功能/农历信息/js/script.js delete mode 100644 frontend/react-app/public/60sapi/实用功能/农历信息/接口集合.json delete mode 100644 frontend/react-app/public/60sapi/实用功能/农历信息/返回接口.json delete mode 100644 frontend/react-app/public/60sapi/实用功能/实时天气/css/background.css delete mode 100644 frontend/react-app/public/60sapi/实用功能/实时天气/css/style.css delete mode 100644 frontend/react-app/public/60sapi/实用功能/实时天气/index.html delete mode 100644 frontend/react-app/public/60sapi/实用功能/实时天气/js/script.js delete mode 100644 frontend/react-app/public/60sapi/实用功能/实时天气/接口集合.json delete mode 100644 frontend/react-app/public/60sapi/实用功能/实时天气/返回接口.json delete mode 100644 frontend/react-app/public/60sapi/实用功能/生成二维码/css/background.css delete mode 100644 frontend/react-app/public/60sapi/实用功能/生成二维码/css/style.css delete mode 100644 frontend/react-app/public/60sapi/实用功能/生成二维码/index.html delete mode 100644 frontend/react-app/public/60sapi/实用功能/生成二维码/js/script.js delete mode 100644 frontend/react-app/public/60sapi/实用功能/生成二维码/接口集合.json delete mode 100644 frontend/react-app/public/60sapi/实用功能/生成二维码/返回接口.json delete mode 100644 frontend/react-app/public/60sapi/实用功能/百度百科词条/css/background.css delete mode 100644 frontend/react-app/public/60sapi/实用功能/百度百科词条/css/style.css delete mode 100644 frontend/react-app/public/60sapi/实用功能/百度百科词条/index.html delete mode 100644 frontend/react-app/public/60sapi/实用功能/百度百科词条/js/script.js delete mode 100644 frontend/react-app/public/60sapi/实用功能/百度百科词条/接口集合.json delete mode 100644 frontend/react-app/public/60sapi/实用功能/百度百科词条/返回接口.json delete mode 100644 frontend/react-app/public/60sapi/日更资讯/历史上的今天/css/style.css delete mode 100644 frontend/react-app/public/60sapi/日更资讯/历史上的今天/index.html delete mode 100644 frontend/react-app/public/60sapi/日更资讯/历史上的今天/js/script.js delete mode 100644 frontend/react-app/public/60sapi/日更资讯/历史上的今天/接口集合.json delete mode 100644 frontend/react-app/public/60sapi/日更资讯/历史上的今天/返回接口.json delete mode 100644 frontend/react-app/public/60sapi/日更资讯/必应每日壁纸/css/style.css delete mode 100644 frontend/react-app/public/60sapi/日更资讯/必应每日壁纸/index.html delete mode 100644 frontend/react-app/public/60sapi/日更资讯/必应每日壁纸/js/script.js delete mode 100644 frontend/react-app/public/60sapi/日更资讯/必应每日壁纸/接口集合.json delete mode 100644 frontend/react-app/public/60sapi/日更资讯/必应每日壁纸/返回接口.json delete mode 100644 frontend/react-app/public/60sapi/日更资讯/每天60s读懂世界/css/style.css delete mode 100644 frontend/react-app/public/60sapi/日更资讯/每天60s读懂世界/index.html delete mode 100644 frontend/react-app/public/60sapi/日更资讯/每天60s读懂世界/js/script.js delete mode 100644 frontend/react-app/public/60sapi/日更资讯/每天60s读懂世界/接口集合.json delete mode 100644 frontend/react-app/public/60sapi/日更资讯/每天60s读懂世界/返回接口.json delete mode 100644 frontend/react-app/public/60sapi/日更资讯/每日国际汇率/css/style.css delete mode 100644 frontend/react-app/public/60sapi/日更资讯/每日国际汇率/index.html delete mode 100644 frontend/react-app/public/60sapi/日更资讯/每日国际汇率/js/script.js delete mode 100644 frontend/react-app/public/60sapi/日更资讯/每日国际汇率/接口集合.json delete mode 100644 frontend/react-app/public/60sapi/日更资讯/每日国际汇率/返回接口.json delete mode 100644 frontend/react-app/public/60sapi/热搜榜单/HackerNews榜单/css/background.css delete mode 100644 frontend/react-app/public/60sapi/热搜榜单/HackerNews榜单/css/style.css delete mode 100644 frontend/react-app/public/60sapi/热搜榜单/HackerNews榜单/index.html delete mode 100644 frontend/react-app/public/60sapi/热搜榜单/HackerNews榜单/js/script.js delete mode 100644 frontend/react-app/public/60sapi/热搜榜单/HackerNews榜单/接口集合.json delete mode 100644 frontend/react-app/public/60sapi/热搜榜单/HackerNews榜单/返回接口.json delete mode 100644 frontend/react-app/public/60sapi/热搜榜单/微博热搜榜/css/background.css delete mode 100644 frontend/react-app/public/60sapi/热搜榜单/微博热搜榜/css/style.css delete mode 100644 frontend/react-app/public/60sapi/热搜榜单/微博热搜榜/index.html delete mode 100644 frontend/react-app/public/60sapi/热搜榜单/微博热搜榜/js/main.js delete mode 100644 frontend/react-app/public/60sapi/热搜榜单/微博热搜榜/接口集合.json delete mode 100644 frontend/react-app/public/60sapi/热搜榜单/微博热搜榜/返回接口.json delete mode 100644 frontend/react-app/public/60sapi/热搜榜单/抖音热搜榜/css/background.css delete mode 100644 frontend/react-app/public/60sapi/热搜榜单/抖音热搜榜/css/style.css delete mode 100644 frontend/react-app/public/60sapi/热搜榜单/抖音热搜榜/index.html delete mode 100644 frontend/react-app/public/60sapi/热搜榜单/抖音热搜榜/js/script.js delete mode 100644 frontend/react-app/public/60sapi/热搜榜单/抖音热搜榜/接口集合.json delete mode 100644 frontend/react-app/public/60sapi/热搜榜单/抖音热搜榜/返回接口.json delete mode 100644 frontend/react-app/public/60sapi/热搜榜单/猫眼票房排行榜/css/style.css delete mode 100644 frontend/react-app/public/60sapi/热搜榜单/猫眼票房排行榜/index.html delete mode 100644 frontend/react-app/public/60sapi/热搜榜单/猫眼票房排行榜/js/script.js delete mode 100644 frontend/react-app/public/60sapi/热搜榜单/猫眼票房排行榜/接口集合.json delete mode 100644 frontend/react-app/public/60sapi/热搜榜单/猫眼票房排行榜/返回接口.json delete mode 100644 frontend/react-app/public/60sapi/热搜榜单/网易云榜单列表/接口集合.json delete mode 100644 frontend/react-app/public/60sapi/热搜榜单/网易云榜单列表/返回接口.json delete mode 100644 frontend/react-app/public/60sapi/热搜榜单/网易云榜单详情/css/background.css delete mode 100644 frontend/react-app/public/60sapi/热搜榜单/网易云榜单详情/css/style.css delete mode 100644 frontend/react-app/public/60sapi/热搜榜单/网易云榜单详情/index.html delete mode 100644 frontend/react-app/public/60sapi/热搜榜单/网易云榜单详情/js/script.js delete mode 100644 frontend/react-app/public/60sapi/热搜榜单/网易云榜单详情/接口集合.json delete mode 100644 frontend/react-app/public/60sapi/热搜榜单/网易云榜单详情/返回接口.json delete mode 100644 frontend/react-app/public/60sapi/生成要求模板.txt create mode 100644 frontend/smallgame/2048/controls.js create mode 100644 frontend/smallgame/2048/game-logic.js create mode 100644 frontend/smallgame/2048/index.html create mode 100644 frontend/smallgame/2048/statistics.js create mode 100644 frontend/smallgame/2048/styles.css create mode 100644 frontend/smallgame/俄罗斯方块/game-controls.js create mode 100644 frontend/smallgame/俄罗斯方块/game-stats.js create mode 100644 frontend/smallgame/俄罗斯方块/index.html create mode 100644 frontend/smallgame/俄罗斯方块/styles.css create mode 100644 frontend/smallgame/俄罗斯方块/tetris.js create mode 100644 frontend/smallgame/别踩白方块/MUSIC.mp3 create mode 100644 frontend/smallgame/别踩白方块/game.js create mode 100644 frontend/smallgame/别踩白方块/index.html create mode 100644 frontend/smallgame/生成要求.txt diff --git a/QQEmailSendAPI.py b/QQEmailSendAPI.py deleted file mode 100644 index 0da7ae92..00000000 --- a/QQEmailSendAPI.py +++ /dev/null @@ -1,543 +0,0 @@ -import smtplib -from email.mime.text import MIMEText -from email.mime.multipart import MIMEMultipart -from email.mime.application import MIMEApplication -from email.header import Header -import random -import string -import json -import os - -# 邮件发送配置 -SENDER_EMAIL = '3205788256@qq.com' # 发件人邮箱 -SENDER_AUTH_CODE = 'szcaxvbftusqddhi' # 授权码 -SMTP_SERVER = 'smtp.qq.com' # QQ邮箱SMTP服务器 -SMTP_PORT = 465 # QQ邮箱SSL端口 - -# 验证码缓存文件 -VERIFICATION_CACHE_FILE = os.path.join("config", "verification_codes.json") - -class QQMailAPI: - """QQ邮箱发送邮件API类""" - - def __init__(self, sender_email, authorization_code): - """ - 初始化邮箱配置 - :param sender_email: 发送方QQ邮箱地址 - :param authorization_code: QQ邮箱授权码 - """ - self.sender_email = sender_email - self.authorization_code = authorization_code - self.smtp_server = 'smtp.qq.com' - self.smtp_port = 465 # SSL端口 - - # 发送纯文本邮件 - def send_text_email(self, receiver_email, subject, content, cc_emails=None): - """ - 发送纯文本邮件 - :param receiver_email: 接收方邮箱地址(单个) - :param subject: 邮件主题 - :param content: 邮件正文内容 - :param cc_emails: 抄送邮箱列表 - :return: 发送成功返回True,失败返回False - """ - try: - # 创建邮件对象 - message = MIMEText(content, 'plain', 'utf-8') - message['From'] = Header(self.sender_email, 'utf-8') - message['To'] = Header(receiver_email, 'utf-8') - message['Subject'] = Header(subject, 'utf-8') - - # 添加抄送 - if cc_emails: - message['Cc'] = Header(",".join(cc_emails), 'utf-8') - all_receivers = [receiver_email] + cc_emails - else: - all_receivers = [receiver_email] - - # 连接SMTP服务器并发送邮件 - with smtplib.SMTP_SSL(self.smtp_server, self.smtp_port) as server: - server.login(self.sender_email, self.authorization_code) - server.sendmail(self.sender_email, all_receivers, message.as_string()) - - print(f"邮件发送成功:主题='{subject}', 收件人='{receiver_email}'") - return True - except Exception as e: - print(f"邮件发送失败:{str(e)}") - return False - - # 发送HTML格式邮件,可带附件 - def send_html_email(self, receiver_email, subject, html_content, cc_emails=None, attachments=None): - """ - 发送HTML格式邮件,可带附件 - :param receiver_email: 接收方邮箱地址(单个) - :param subject: 邮件主题 - :param html_content: HTML格式的邮件正文 - :param cc_emails: 抄送邮箱列表 - :param attachments: 附件文件路径列表 - :return: 发送成功返回True,失败返回False - """ - try: - # 创建带附件的邮件对象 - message = MIMEMultipart() - message['From'] = Header(self.sender_email, 'utf-8') - message['To'] = Header(receiver_email, 'utf-8') - message['Subject'] = Header(subject, 'utf-8') - - # 添加抄送 - if cc_emails: - message['Cc'] = Header(",".join(cc_emails), 'utf-8') - all_receivers = [receiver_email] + cc_emails - else: - all_receivers = [receiver_email] - - # 添加HTML正文 - message.attach(MIMEText(html_content, 'html', 'utf-8')) - - # 添加附件 - if attachments: - for file_path in attachments: - try: - with open(file_path, 'rb') as file: - attachment = MIMEApplication(file.read(), _subtype="octet-stream") - attachment.add_header('Content-Disposition', 'attachment', filename=file_path.split("/")[-1]) - message.attach(attachment) - except Exception as e: - print(f"添加附件失败 {file_path}: {str(e)}") - - # 连接SMTP服务器并发送邮件 - with smtplib.SMTP_SSL(self.smtp_server, self.smtp_port) as server: - server.login(self.sender_email, self.authorization_code) - server.sendmail(self.sender_email, all_receivers, message.as_string()) - - print(f"HTML邮件发送成功:主题='{subject}', 收件人='{receiver_email}'") - return True - except Exception as e: - print(f"HTML邮件发送失败:{str(e)}") - return False - -class EmailVerification: - - #生成指定长度的随机验证码 - @staticmethod - def generate_verification_code(length=6): - """ - 生成指定长度的随机验证码 - - 参数: - length (int): 验证码长度,默认6位 - - 返回: - str: 生成的验证码 - """ - # 生成包含大写字母和数字的验证码 - chars = string.ascii_uppercase + string.digits - return ''.join(random.choice(chars) for _ in range(length)) - - #发送验证码邮件到QQ邮箱 - @staticmethod - def send_verification_email(qq_number, verification_code, email_type="register"): - """ - 发送验证码邮件到QQ邮箱 - - 参数: - qq_number (str): 接收者QQ号 - verification_code (str): 验证码 - email_type (str): 邮件类型,"register" 或 "reset_password" - - 返回: - bool: 发送成功返回True,否则返回False - str: 成功或错误信息 - """ - receiver_email = f"{qq_number}@qq.com" - - # 根据邮件类型设置不同的内容 - if email_type == "reset_password": - email_title = "【萌芽农场】密码重置验证码" - email_purpose = "重置萌芽农场游戏账号密码" - email_color = "#FF6B35" # 橙红色,表示警告性操作 - else: - email_title = "【萌芽农场】注册验证码" - email_purpose = "注册萌芽农场游戏账号" - email_color = "#4CAF50" # 绿色,表示正常操作 - - # 创建邮件内容 - message = MIMEText(f''' - - -
-

萌芽农场 - 邮箱验证码

-

亲爱的玩家,您好!

-

您正在{email_purpose},您的验证码是:

-
- {verification_code} -
-

该验证码有效期为5分钟,请勿泄露给他人。

-

如果这不是您本人的操作,请忽略此邮件。

-

- 本邮件由系统自动发送,请勿直接回复。 -

-
- - - ''', 'html', 'utf-8') - - # 修正From头格式,符合QQ邮箱的要求 - message['From'] = SENDER_EMAIL - message['To'] = receiver_email - message['Subject'] = Header(email_title, 'utf-8') - - try: - # 使用SSL/TLS连接而不是STARTTLS - smtp_obj = smtplib.SMTP_SSL(SMTP_SERVER, 465) - smtp_obj.login(SENDER_EMAIL, SENDER_AUTH_CODE) - smtp_obj.sendmail(SENDER_EMAIL, [receiver_email], message.as_string()) - smtp_obj.quit() - return True, "验证码发送成功" - except Exception as e: - return False, f"发送验证码失败: {str(e)}" - - #保存验证码到MongoDB(优先)或缓存文件(备用) - @staticmethod - def save_verification_code(qq_number, verification_code, expiry_time=300, code_type="register"): - """ - 保存验证码到MongoDB(优先)或缓存文件(备用) - - 参数: - qq_number (str): QQ号 - verification_code (str): 验证码 - expiry_time (int): 过期时间(秒),默认5分钟 - code_type (str): 验证码类型,"register" 或 "reset_password" - - 返回: - bool: 保存成功返回True,否则返回False - """ - import time - - # 优先尝试使用MongoDB - try: - from SMYMongoDBAPI import SMYMongoDBAPI - import os - # 根据环境动态选择MongoDB配置 - if os.path.exists('/.dockerenv') or os.environ.get('PRODUCTION', '').lower() == 'true': - environment = "production" - else: - environment = "test" - mongo_api = SMYMongoDBAPI(environment) - if mongo_api.is_connected(): - success = mongo_api.save_verification_code(qq_number, verification_code, expiry_time, code_type) - if success: - print(f"[验证码系统-MongoDB] 为QQ {qq_number} 保存{code_type}验证码: {verification_code}") - return True - else: - print(f"[验证码系统-MongoDB] 保存失败,尝试使用JSON文件") - except Exception as e: - print(f"[验证码系统-MongoDB] MongoDB保存失败: {str(e)},尝试使用JSON文件") - - # MongoDB失败,使用JSON文件备用 - # 创建目录(如果不存在) - os.makedirs(os.path.dirname(VERIFICATION_CACHE_FILE), exist_ok=True) - - # 读取现有的验证码数据 - verification_data = {} - if os.path.exists(VERIFICATION_CACHE_FILE): - try: - with open(VERIFICATION_CACHE_FILE, 'r', encoding='utf-8') as file: - verification_data = json.load(file) - except Exception as e: - print(f"读取验证码文件失败: {str(e)}") - verification_data = {} - - # 添加新的验证码 - expire_at = time.time() + expiry_time - current_time = time.time() - - # 创建验证码记录,包含更多信息用于调试 - verification_data[qq_number] = { - "code": verification_code, - "expire_at": expire_at, - "code_type": code_type, - "created_at": current_time, - "used": False # 新增:标记验证码是否已使用 - } - - # 保存到文件 - try: - with open(VERIFICATION_CACHE_FILE, 'w', encoding='utf-8') as file: - json.dump(verification_data, file, indent=2, ensure_ascii=False) - - print(f"[验证码系统-JSON] 为QQ {qq_number} 保存{code_type}验证码: {verification_code}, 过期时间: {expire_at}") - return True - except Exception as e: - print(f"保存验证码失败: {str(e)}") - return False - - #验证用户输入的验证码(优先使用MongoDB) - @staticmethod - def verify_code(qq_number, input_code, code_type="register"): - """ - 验证用户输入的验证码(优先使用MongoDB) - - 参数: - qq_number (str): QQ号 - input_code (str): 用户输入的验证码 - code_type (str): 验证码类型,"register" 或 "reset_password" - - 返回: - bool: 验证成功返回True,否则返回False - str: 成功或错误信息 - """ - import time - - # 优先尝试使用MongoDB - try: - from SMYMongoDBAPI import SMYMongoDBAPI - import os - # 根据环境动态选择MongoDB配置 - if os.path.exists('/.dockerenv') or os.environ.get('PRODUCTION', '').lower() == 'true': - environment = "production" - else: - environment = "test" - mongo_api = SMYMongoDBAPI(environment) - if mongo_api.is_connected(): - success, message = mongo_api.verify_verification_code(qq_number, input_code, code_type) - print(f"[验证码系统-MongoDB] QQ {qq_number} 验证结果: {success}, 消息: {message}") - return success, message - except Exception as e: - print(f"[验证码系统-MongoDB] MongoDB验证失败: {str(e)},尝试使用JSON文件") - - # MongoDB失败,使用JSON文件备用 - # 检查缓存文件是否存在 - if not os.path.exists(VERIFICATION_CACHE_FILE): - print(f"[验证码系统-JSON] QQ {qq_number} 验证失败: 缓存文件不存在") - return False, "验证码不存在或已过期" - - # 读取验证码数据 - try: - with open(VERIFICATION_CACHE_FILE, 'r', encoding='utf-8') as file: - verification_data = json.load(file) - except Exception as e: - print(f"[验证码系统-JSON] 读取验证码文件失败: {str(e)}") - return False, "验证码数据损坏" - - # 检查该QQ号是否有验证码 - if qq_number not in verification_data: - print(f"[验证码系统-JSON] QQ {qq_number} 验证失败: 没有找到验证码记录") - return False, "验证码不存在,请重新获取" - - # 获取存储的验证码信息 - code_info = verification_data[qq_number] - stored_code = code_info.get("code", "") - expire_at = code_info.get("expire_at", 0) - stored_code_type = code_info.get("code_type", "register") - is_used = code_info.get("used", False) - created_at = code_info.get("created_at", 0) - - print(f"[验证码系统-JSON] QQ {qq_number} 验证码详情: 存储码={stored_code}, 输入码={input_code}, 类型={stored_code_type}, 已使用={is_used}, 创建时间={created_at}") - - # 检查验证码类型是否匹配 - if stored_code_type != code_type: - print(f"[验证码系统-JSON] QQ {qq_number} 验证失败: 验证码类型不匹配,存储类型={stored_code_type}, 请求类型={code_type}") - return False, f"验证码类型不匹配,请重新获取{code_type}验证码" - - # 检查验证码是否已被使用 - if is_used: - print(f"[验证码系统-JSON] QQ {qq_number} 验证失败: 验证码已被使用") - return False, "验证码已被使用,请重新获取" - - # 检查验证码是否过期 - current_time = time.time() - if current_time > expire_at: - # 移除过期的验证码 - del verification_data[qq_number] - with open(VERIFICATION_CACHE_FILE, 'w', encoding='utf-8') as file: - json.dump(verification_data, file, indent=2, ensure_ascii=False) - print(f"[验证码系统-JSON] QQ {qq_number} 验证失败: 验证码已过期") - return False, "验证码已过期,请重新获取" - - # 验证码比较(不区分大小写) - if input_code.upper() == stored_code.upper(): - # 验证成功,标记为已使用而不是删除 - verification_data[qq_number]["used"] = True - verification_data[qq_number]["used_at"] = current_time - - try: - with open(VERIFICATION_CACHE_FILE, 'w', encoding='utf-8') as file: - json.dump(verification_data, file, indent=2, ensure_ascii=False) - print(f"[验证码系统-JSON] QQ {qq_number} 验证成功: 验证码已标记为已使用") - return True, "验证码正确" - except Exception as e: - print(f"[验证码系统-JSON] 标记验证码已使用时失败: {str(e)}") - return True, "验证码正确" # 即使标记失败,验证还是成功的 - else: - print(f"[验证码系统-JSON] QQ {qq_number} 验证失败: 验证码不匹配") - return False, "验证码错误" - - #清理过期的验证码和已使用的验证码(优先使用MongoDB) - @staticmethod - def clean_expired_codes(): - """ - 清理过期的验证码和已使用的验证码(优先使用MongoDB) - """ - import time - - # 优先尝试使用MongoDB - try: - from SMYMongoDBAPI import SMYMongoDBAPI - import os - # 根据环境动态选择MongoDB配置 - if os.path.exists('/.dockerenv') or os.environ.get('PRODUCTION', '').lower() == 'true': - environment = "production" - else: - environment = "test" - mongo_api = SMYMongoDBAPI(environment) - if mongo_api.is_connected(): - expired_count = mongo_api.clean_expired_verification_codes() - print(f"[验证码系统-MongoDB] 清理完成,删除了 {expired_count} 个过期验证码") - return expired_count - except Exception as e: - print(f"[验证码系统-MongoDB] MongoDB清理失败: {str(e)},尝试使用JSON文件") - - # MongoDB失败,使用JSON文件备用 - if not os.path.exists(VERIFICATION_CACHE_FILE): - return - - try: - with open(VERIFICATION_CACHE_FILE, 'r', encoding='utf-8') as file: - verification_data = json.load(file) - - current_time = time.time() - removed_keys = [] - - # 找出过期的验证码和已使用的验证码(超过1小时) - for qq_number, code_info in verification_data.items(): - expire_at = code_info.get("expire_at", 0) - is_used = code_info.get("used", False) - used_at = code_info.get("used_at", 0) - - should_remove = False - - # 过期的验证码 - if current_time > expire_at: - should_remove = True - print(f"[验证码清理-JSON] 移除过期验证码: QQ {qq_number}") - - # 已使用超过1小时的验证码 - elif is_used and used_at > 0 and (current_time - used_at) > 3600: - should_remove = True - print(f"[验证码清理-JSON] 移除已使用的验证码: QQ {qq_number}") - - if should_remove: - removed_keys.append(qq_number) - - # 移除标记的验证码 - for key in removed_keys: - del verification_data[key] - - # 保存更新后的数据 - if removed_keys: - with open(VERIFICATION_CACHE_FILE, 'w', encoding='utf-8') as file: - json.dump(verification_data, file, indent=2, ensure_ascii=False) - print(f"[验证码清理-JSON] 共清理了 {len(removed_keys)} 个验证码") - - except Exception as e: - print(f"清理验证码失败: {str(e)}") - - #获取验证码状态(优先使用MongoDB) - @staticmethod - def get_verification_status(qq_number): - """ - 获取验证码状态(优先使用MongoDB) - - 参数: - qq_number (str): QQ号 - - 返回: - dict: 验证码状态信息 - """ - import time - - # 优先尝试使用MongoDB - try: - from SMYMongoDBAPI import SMYMongoDBAPI - import os - # 根据环境动态选择MongoDB配置 - if os.path.exists('/.dockerenv') or os.environ.get('PRODUCTION', '').lower() == 'true': - environment = "production" - else: - environment = "test" - mongo_api = SMYMongoDBAPI(environment) - if mongo_api.is_connected(): - verification_codes = mongo_api.get_verification_codes() - if verification_codes and qq_number in verification_codes: - code_info = verification_codes[qq_number] - current_time = time.time() - - return { - "status": "found", - "code": code_info.get("code", ""), - "code_type": code_info.get("code_type", "unknown"), - "used": code_info.get("used", False), - "expired": current_time > code_info.get("expire_at", 0), - "created_at": code_info.get("created_at", 0), - "expire_at": code_info.get("expire_at", 0), - "used_at": code_info.get("used_at", 0), - "source": "mongodb" - } - else: - return {"status": "no_code", "source": "mongodb"} - except Exception as e: - print(f"[验证码系统-MongoDB] MongoDB状态查询失败: {str(e)},尝试使用JSON文件") - - # MongoDB失败,使用JSON文件备用 - if not os.path.exists(VERIFICATION_CACHE_FILE): - return {"status": "no_cache_file"} - - try: - with open(VERIFICATION_CACHE_FILE, 'r', encoding='utf-8') as file: - verification_data = json.load(file) - - if qq_number not in verification_data: - return {"status": "no_code"} - - code_info = verification_data[qq_number] - current_time = time.time() - - return { - "status": "found", - "code": code_info.get("code", ""), - "code_type": code_info.get("code_type", "unknown"), - "used": code_info.get("used", False), - "expired": current_time > code_info.get("expire_at", 0), - "created_at": code_info.get("created_at", 0), - "expire_at": code_info.get("expire_at", 0), - "used_at": code_info.get("used_at", 0), - "source": "json" - } - - except Exception as e: - return {"status": "error", "message": str(e)} - - -# 测试邮件发送 -if __name__ == "__main__": - # 清理过期验证码 - EmailVerification.clean_expired_codes() - - # 生成验证码 - test_qq = input("请输入测试QQ号: ") - verification_code = EmailVerification.generate_verification_code() - print(f"生成的验证码: {verification_code}") - - # 发送测试邮件 - success, message = EmailVerification.send_verification_email(test_qq, verification_code) - print(f"发送结果: {success}, 消息: {message}") - - if success: - # 保存验证码 - EmailVerification.save_verification_code(test_qq, verification_code) - - # 测试验证 - test_input = input("请输入收到的验证码: ") - verify_success, verify_message = EmailVerification.verify_code(test_qq, test_input) - print(f"验证结果: {verify_success}, 消息: {verify_message}") \ No newline at end of file diff --git a/backend/app.py b/backend/app.py index 20905b62..7a381449 100644 --- a/backend/app.py +++ b/backend/app.py @@ -19,6 +19,8 @@ from modules.auth import auth_bp from modules.api_60s import api_60s_bp from modules.user_management import user_bp from modules.email_service import init_mail +from modules.smallgame import smallgame_bp +from modules.aimodelapp import aimodelapp_bp from config import Config @@ -43,6 +45,8 @@ def create_app(): app.register_blueprint(auth_bp, url_prefix='/api/auth') app.register_blueprint(api_60s_bp, url_prefix='/api/60s') app.register_blueprint(user_bp, url_prefix='/api/user') + app.register_blueprint(smallgame_bp, url_prefix='/api/smallgame') + app.register_blueprint(aimodelapp_bp, url_prefix='/api/aimodelapp') # 基础路由 @app.route('/') @@ -55,7 +59,9 @@ def create_app(): 'endpoints': { 'auth': '/api/auth', '60s_api': '/api/60s', - 'user': '/api/user' + 'user': '/api/user', + 'smallgame': '/api/smallgame', + 'aimodelapp': '/api/aimodelapp' } }) @@ -102,6 +108,60 @@ def create_app(): except Exception as e: return jsonify({'error': f'文件服务错误: {str(e)}'}), 500 + # smallgame静态文件服务 + @app.route('/smallgame/') + def serve_smallgame_files(filename): + """提供smallgame目录下的静态文件服务""" + try: + # 获取项目根目录 + project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + game_directory = os.path.join(project_root, 'frontend', 'smallgame') + + # 安全检查:确保文件路径在允许的目录内 + full_path = os.path.join(game_directory, filename) + if not os.path.commonpath([game_directory, full_path]) == game_directory: + return jsonify({'error': '非法文件路径'}), 403 + + # 检查文件是否存在 + if not os.path.exists(full_path): + return jsonify({'error': '文件不存在'}), 404 + + # 获取文件目录和文件名 + directory = os.path.dirname(full_path) + file_name = os.path.basename(full_path) + + return send_from_directory(directory, file_name) + + except Exception as e: + return jsonify({'error': f'文件服务错误: {str(e)}'}), 500 + + # aimodelapp静态文件服务 + @app.route('/aimodelapp/') + def serve_aimodelapp_files(filename): + """提供aimodelapp目录下的静态文件服务""" + try: + # 获取项目根目录 + project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + ai_directory = os.path.join(project_root, 'frontend', 'aimodelapp') + + # 安全检查:确保文件路径在允许的目录内 + full_path = os.path.join(ai_directory, filename) + if not os.path.commonpath([ai_directory, full_path]) == ai_directory: + return jsonify({'error': '非法文件路径'}), 403 + + # 检查文件是否存在 + if not os.path.exists(full_path): + return jsonify({'error': '文件不存在'}), 404 + + # 获取文件目录和文件名 + directory = os.path.dirname(full_path) + file_name = os.path.basename(full_path) + + return send_from_directory(directory, file_name) + + except Exception as e: + return jsonify({'error': f'文件服务错误: {str(e)}'}), 500 + # 错误处理 @app.errorhandler(404) def not_found(error): diff --git a/backend/modules/aimodelapp.py b/backend/modules/aimodelapp.py new file mode 100644 index 00000000..cbcbcc1f --- /dev/null +++ b/backend/modules/aimodelapp.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +AI应用模块 - 提供AI应用静态文件服务和目录扫描 +Created by: 神奇万事通 +Date: 2025-09-02 +""" + +from flask import Blueprint, jsonify +import os + +aimodelapp_bp = Blueprint('aimodelapp', __name__) + +@aimodelapp_bp.route('/scan-directories', methods=['GET']) +def scan_directories(): + """扫描aimodelapp目录结构""" + try: + # 获取项目根目录 + project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + ai_directory = os.path.join(project_root, 'frontend', 'aimodelapp') + + if not os.path.exists(ai_directory): + return jsonify({ + 'success': False, + 'message': 'aimodelapp目录不存在' + }), 404 + + apps = [] + + # 颜色渐变配置 + gradient_colors = [ + 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)', + 'linear-gradient(135deg, #f093fb 0%, #f5576c 100%)', + 'linear-gradient(135deg, #4facfe 0%, #00f2fe 100%)', + 'linear-gradient(135deg, #43e97b 0%, #38f9d7 100%)', + 'linear-gradient(135deg, #fa709a 0%, #fee140 100%)' + ] + + # 扫描目录 + for i, app_name in enumerate(os.listdir(ai_directory)): + app_path = os.path.join(ai_directory, app_name) + index_path = os.path.join(app_path, 'index.html') + + if os.path.isdir(app_path) and os.path.exists(index_path) and not app_name.endswith('.txt'): + # 读取HTML文件获取标题 + try: + with open(index_path, 'r', encoding='utf-8') as f: + html_content = f.read() + title_match = html_content.find('') + if title_match != -1: + title_end = html_content.find('', title_match) + if title_end != -1: + title = html_content[title_match + 7:title_end].strip() + else: + title = app_name + else: + title = app_name + except: + title = app_name + + apps.append({ + 'title': title, + 'description': f'{app_name}AI应用', + 'link': f'/aimodelapp/{app_name}/index.html', + 'status': 'active', + 'color': gradient_colors[i % len(gradient_colors)] + }) + + return jsonify({ + 'success': True, + 'apps': apps + }) + + except Exception as e: + return jsonify({ + 'success': False, + 'message': f'扫描目录时出错: {str(e)}' + }), 500 \ No newline at end of file diff --git a/backend/modules/api_60s.py b/backend/modules/api_60s.py index 8d1ba3ea..9d839809 100644 --- a/backend/modules/api_60s.py +++ b/backend/modules/api_60s.py @@ -6,334 +6,15 @@ Created by: 神奇万事通 Date: 2025-09-02 """ -from flask import Blueprint, jsonify, request -import requests -import json -from datetime import datetime, timedelta -import random -import time +from flask import Blueprint, jsonify +import os api_60s_bp = Blueprint('api_60s', __name__) -# API配置 -API_ENDPOINTS = { - '抖音热搜': { - 'urls': [ - 'https://api.vvhan.com/api/hotlist?type=douyin', - 'https://tenapi.cn/v2/douyinhot', - 'https://api.oioweb.cn/api/common/tebie/dyhot' - ], - 'cache_time': 600 # 10分钟缓存 - }, - '微博热搜': { - 'urls': [ - 'https://api.vvhan.com/api/hotlist?type=weibo', - 'https://tenapi.cn/v2/wbhot', - 'https://api.oioweb.cn/api/common/tebie/wbhot' - ], - 'cache_time': 300 # 5分钟缓存 - }, - '猫眼票房': { - 'urls': [ - 'https://api.vvhan.com/api/hotlist?type=maoyan', - 'https://tenapi.cn/v2/maoyan' - ], - 'cache_time': 3600 # 1小时缓存 - }, - '网易云音乐': { - 'urls': [ - 'https://api.vvhan.com/api/hotlist?type=netease', - 'https://tenapi.cn/v2/music' - ], - 'cache_time': 1800 # 30分钟缓存 - }, - 'HackerNews': { - 'urls': [ - 'https://api.vvhan.com/api/hotlist?type=hackernews', - 'https://hacker-news.firebaseio.com/v0/topstories.json' - ], - 'cache_time': 1800 # 30分钟缓存 - } -} - -# 内存缓存 -cache = {} - -def fetch_data_with_fallback(urls, timeout=10): - """使用备用URL获取数据""" - for url in urls: - try: - response = requests.get(url, timeout=timeout, headers={ - 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' - }) - if response.status_code == 200: - return response.json() - except Exception as e: - print(f"URL {url} 失败: {str(e)}") - continue - return None - -def get_cached_data(key, cache_time): - """获取缓存数据""" - if key in cache: - cached_time, data = cache[key] - if datetime.now() - cached_time < timedelta(seconds=cache_time): - return data - return None - -def set_cache_data(key, data): - """设置缓存数据""" - cache[key] = (datetime.now(), data) - -@api_60s_bp.route('/douyin', methods=['GET']) -def get_douyin_hot(): - """获取抖音热搜榜""" - try: - # 检查缓存 - cached = get_cached_data('douyin', API_ENDPOINTS['抖音热搜']['cache_time']) - if cached: - return jsonify({ - 'success': True, - 'data': cached, - 'update_time': datetime.now().strftime('%Y-%m-%d %H:%M:%S'), - 'from_cache': True - }) - - # 获取新数据 - data = fetch_data_with_fallback(API_ENDPOINTS['抖音热搜']['urls']) - - if data: - # 标准化数据格式 - if 'data' in data: - hot_list = data['data'] - elif isinstance(data, list): - hot_list = data - else: - hot_list = [] - - result = { - 'title': '抖音热搜榜', - 'subtitle': '实时热门话题 · 紧跟潮流趋势', - 'update_time': datetime.now().strftime('%Y-%m-%d %H:%M:%S'), - 'total': len(hot_list), - 'list': hot_list[:50] # 最多返回50条 - } - - # 设置缓存 - set_cache_data('douyin', result) - - return jsonify({ - 'success': True, - 'data': result, - 'from_cache': False - }) - else: - return jsonify({ - 'success': False, - 'message': '获取数据失败,所有数据源暂时不可用' - }), 503 - - except Exception as e: - return jsonify({ - 'success': False, - 'message': f'服务器错误: {str(e)}' - }), 500 - -@api_60s_bp.route('/weibo', methods=['GET']) -def get_weibo_hot(): - """获取微博热搜榜""" - try: - # 检查缓存 - cached = get_cached_data('weibo', API_ENDPOINTS['微博热搜']['cache_time']) - if cached: - return jsonify({ - 'success': True, - 'data': cached, - 'update_time': datetime.now().strftime('%Y-%m-%d %H:%M:%S'), - 'from_cache': True - }) - - # 获取新数据 - data = fetch_data_with_fallback(API_ENDPOINTS['微博热搜']['urls']) - - if data: - if 'data' in data: - hot_list = data['data'] - elif isinstance(data, list): - hot_list = data - else: - hot_list = [] - - result = { - 'title': '微博热搜榜', - 'subtitle': '热门话题 · 实时更新', - 'update_time': datetime.now().strftime('%Y-%m-%d %H:%M:%S'), - 'total': len(hot_list), - 'list': hot_list[:50] - } - - set_cache_data('weibo', result) - - return jsonify({ - 'success': True, - 'data': result, - 'from_cache': False - }) - else: - return jsonify({ - 'success': False, - 'message': '获取数据失败,所有数据源暂时不可用' - }), 503 - - except Exception as e: - return jsonify({ - 'success': False, - 'message': f'服务器错误: {str(e)}' - }), 500 - -@api_60s_bp.route('/maoyan', methods=['GET']) -def get_maoyan_box_office(): - """获取猫眼票房排行榜""" - try: - cached = get_cached_data('maoyan', API_ENDPOINTS['猫眼票房']['cache_time']) - if cached: - return jsonify({ - 'success': True, - 'data': cached, - 'from_cache': True - }) - - data = fetch_data_with_fallback(API_ENDPOINTS['猫眼票房']['urls']) - - if data: - if 'data' in data: - box_office_list = data['data'] - elif isinstance(data, list): - box_office_list = data - else: - box_office_list = [] - - result = { - 'title': '猫眼票房排行榜', - 'subtitle': '实时票房数据', - 'update_time': datetime.now().strftime('%Y-%m-%d %H:%M:%S'), - 'total': len(box_office_list), - 'list': box_office_list[:20] - } - - set_cache_data('maoyan', result) - - return jsonify({ - 'success': True, - 'data': result, - 'from_cache': False - }) - else: - return jsonify({ - 'success': False, - 'message': '获取数据失败' - }), 503 - - except Exception as e: - return jsonify({ - 'success': False, - 'message': f'服务器错误: {str(e)}' - }), 500 - -@api_60s_bp.route('/60s', methods=['GET']) -def get_60s_news(): - """获取每天60秒读懂世界""" - try: - urls = [ - 'https://60s-cf.viki.moe', - 'https://60s.viki.moe', - 'https://60s.b23.run' - ] - - data = fetch_data_with_fallback(urls) - - if data: - return jsonify({ - 'success': True, - 'data': { - 'title': '每天60秒读懂世界', - 'content': data, - 'update_time': datetime.now().strftime('%Y-%m-%d %H:%M:%S') - } - }) - else: - return jsonify({ - 'success': False, - 'message': '获取数据失败' - }), 503 - - except Exception as e: - return jsonify({ - 'success': False, - 'message': f'服务器错误: {str(e)}' - }), 500 - -@api_60s_bp.route('/bing-wallpaper', methods=['GET']) -def get_bing_wallpaper(): - """获取必应每日壁纸""" - try: - url = 'https://api.vvhan.com/api/bing' - response = requests.get(url, timeout=10) - - if response.status_code == 200: - return jsonify({ - 'success': True, - 'data': { - 'title': '必应每日壁纸', - 'image_url': response.url, - 'update_time': datetime.now().strftime('%Y-%m-%d %H:%M:%S') - } - }) - else: - return jsonify({ - 'success': False, - 'message': '获取壁纸失败' - }), 503 - - except Exception as e: - return jsonify({ - 'success': False, - 'message': f'服务器错误: {str(e)}' - }), 500 - -@api_60s_bp.route('/weather', methods=['GET']) -def get_weather(): - """获取天气信息""" - try: - city = request.args.get('city', '北京') - url = f'https://api.vvhan.com/api/weather?city={city}' - - response = requests.get(url, timeout=10) - - if response.status_code == 200: - data = response.json() - return jsonify({ - 'success': True, - 'data': data - }) - else: - return jsonify({ - 'success': False, - 'message': '获取天气信息失败' - }), 503 - - except Exception as e: - return jsonify({ - 'success': False, - 'message': f'服务器错误: {str(e)}' - }), 500 - @api_60s_bp.route('/scan-directories', methods=['GET']) def scan_directories(): """扫描60sapi目录结构""" try: - import os - # 获取项目根目录 project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) api_directory = os.path.join(project_root, 'frontend', '60sapi') @@ -395,7 +76,7 @@ def scan_directories(): apis.append({ 'title': title, 'description': f'{module_name}相关功能', - 'link': f'/60sapi/{category_name}/{module_name}/index.html', + 'link': f'http://localhost:5000/60sapi/{category_name}/{module_name}/index.html', 'status': 'active', 'color': gradient_colors[i % len(gradient_colors)] }) diff --git a/backend/modules/auth.py b/backend/modules/auth.py index d091ac1d..5a724f50 100644 --- a/backend/modules/auth.py +++ b/backend/modules/auth.py @@ -317,6 +317,7 @@ def login(): session['user_id'] = str(user['_id']) session['email'] = email session['username'] = user.get('用户名', '') + session['logged_in'] = True session.permanent = True return jsonify({ @@ -394,13 +395,14 @@ def logout(): def check_login(): """检查登录状态""" try: - if session.get('logged_in'): + if session.get('logged_in') and session.get('user_id'): return jsonify({ 'success': True, 'logged_in': True, 'user': { - 'account': session.get('account'), - 'user_id': session.get('user_id') + 'id': session.get('user_id'), + 'email': session.get('email'), + 'username': session.get('username') } }), 200 else: diff --git a/backend/modules/smallgame.py b/backend/modules/smallgame.py new file mode 100644 index 00000000..90c28220 --- /dev/null +++ b/backend/modules/smallgame.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +小游戏模块 - 提供小游戏静态文件服务和目录扫描 +Created by: 神奇万事通 +Date: 2025-09-02 +""" + +from flask import Blueprint, jsonify +import os + +smallgame_bp = Blueprint('smallgame', __name__) + +@smallgame_bp.route('/scan-directories', methods=['GET']) +def scan_directories(): + """扫描smallgame目录结构""" + try: + # 获取项目根目录 + project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + game_directory = os.path.join(project_root, 'frontend', 'smallgame') + + if not os.path.exists(game_directory): + return jsonify({ + 'success': False, + 'message': 'smallgame目录不存在' + }), 404 + + games = [] + + # 颜色渐变配置 + gradient_colors = [ + 'linear-gradient(135deg, #ff9a9e 0%, #fecfef 100%)', + 'linear-gradient(135deg, #a8edea 0%, #fed6e3 100%)', + 'linear-gradient(135deg, #ffecd2 0%, #fcb69f 100%)', + 'linear-gradient(135deg, #ff8a80 0%, #ffab91 100%)', + 'linear-gradient(135deg, #81c784 0%, #aed581 100%)' + ] + + # 扫描目录 + for i, game_name in enumerate(os.listdir(game_directory)): + game_path = os.path.join(game_directory, game_name) + index_path = os.path.join(game_path, 'index.html') + + if os.path.isdir(game_path) and os.path.exists(index_path) and not game_name.endswith('.txt'): + # 读取HTML文件获取标题 + try: + with open(index_path, 'r', encoding='utf-8') as f: + html_content = f.read() + title_match = html_content.find('') + if title_match != -1: + title_end = html_content.find('', title_match) + if title_end != -1: + title = html_content[title_match + 7:title_end].strip() + else: + title = game_name + else: + title = game_name + except: + title = game_name + + games.append({ + 'title': title, + 'description': f'{game_name}小游戏', + 'link': f'/smallgame/{game_name}/index.html', + 'status': 'active', + 'color': gradient_colors[i % len(gradient_colors)] + }) + + return jsonify({ + 'success': True, + 'games': games + }) + + except Exception as e: + return jsonify({ + 'success': False, + 'message': f'扫描目录时出错: {str(e)}' + }), 500 \ No newline at end of file diff --git a/frontend/aimodelapp/AI写诗小助手/index.html b/frontend/aimodelapp/AI写诗小助手/index.html new file mode 100644 index 00000000..6d7dd105 --- /dev/null +++ b/frontend/aimodelapp/AI写诗小助手/index.html @@ -0,0 +1,335 @@ + + + + + + AI古诗生成器 + + + +
+
+

AI古诗生成器

+

让人工智能为您创作优美的中国古诗

+
+ + + +
+ + +
+ + + +
+

生成的古诗

+
正在创作中,请稍候...
+
点击"生成古诗"按钮,AI将为您创作优美的古诗
+
+
+ + + + \ No newline at end of file diff --git a/frontend/aimodelapp/AI变量命名助手/index.html b/frontend/aimodelapp/AI变量命名助手/index.html new file mode 100644 index 00000000..82713327 --- /dev/null +++ b/frontend/aimodelapp/AI变量命名助手/index.html @@ -0,0 +1,42 @@ + + + + + + AI变量命名助手 + + + +
+
+

AI变量命名助手

+

让AI帮您生成规范的变量名

+
+ +
+
+ + +
+ + + + +
+ +
+

推荐的变量名

+
正在生成中,请稍候...
+
+
点击"生成变量名"按钮,AI将为您推荐合适的变量名
+
+
+
+ + + + \ No newline at end of file diff --git a/frontend/aimodelapp/AI变量命名助手/script.js b/frontend/aimodelapp/AI变量命名助手/script.js new file mode 100644 index 00000000..ba22c936 --- /dev/null +++ b/frontend/aimodelapp/AI变量命名助手/script.js @@ -0,0 +1,305 @@ +// GitHub Models API 配置 +const GITHUB_TOKEN = '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'; +const API_URL = 'https://models.github.ai/inference/chat/completions'; +const MODEL_NAME = 'openai/gpt-4o-mini'; + +// DOM 元素 +const descriptionInput = document.getElementById('description'); +const generateBtn = document.getElementById('generateBtn'); +const loadingDiv = document.getElementById('loading'); +const suggestionsContainer = document.getElementById('suggestions'); + +// 命名规范转换函数 +const namingConventions = { + camelCase: (words) => { + if (words.length === 0) return ''; + return words[0].toLowerCase() + words.slice(1).map(word => + word.charAt(0).toUpperCase() + word.slice(1).toLowerCase() + ).join(''); + }, + + PascalCase: (words) => { + return words.map(word => + word.charAt(0).toUpperCase() + word.slice(1).toLowerCase() + ).join(''); + }, + + snake_case: (words) => { + return words.map(word => word.toLowerCase()).join('_'); + }, + + 'kebab-case': (words) => { + return words.map(word => word.toLowerCase()).join('-'); + }, + + CONSTANT_CASE: (words) => { + return words.map(word => word.toUpperCase()).join('_'); + } +}; + +// 创建AI提示词 +function createNamingPrompt(description) { + return `你是一个专业的变量命名助手。请根据以下描述为变量生成合适的名称: + +描述:${description} + +请为每种命名规范生成3个变量名建议: +1. camelCase (驼峰命名法) +2. PascalCase (帕斯卡命名法) +3. snake_case (下划线命名法) +4. kebab-case (短横线命名法) +5. CONSTANT_CASE (常量命名法) + +要求: +- 变量名要准确反映功能和用途 +- 严格遵循各自的命名规范 +- 避免使用缩写,除非是广泛认知的缩写 +- 名称要简洁但具有描述性 +- 考虑代码的可读性和维护性 + +请按以下JSON格式返回: +{ + "suggestions": { + "camelCase": [ + {"name": "变量名1", "description": "解释说明1"}, + {"name": "变量名2", "description": "解释说明2"}, + {"name": "变量名3", "description": "解释说明3"} + ], + "PascalCase": [ + {"name": "变量名1", "description": "解释说明1"}, + {"name": "变量名2", "description": "解释说明2"}, + {"name": "变量名3", "description": "解释说明3"} + ], + "snake_case": [ + {"name": "变量名1", "description": "解释说明1"}, + {"name": "变量名2", "description": "解释说明2"}, + {"name": "变量名3", "description": "解释说明3"} + ], + "kebab-case": [ + {"name": "变量名1", "description": "解释说明1"}, + {"name": "变量名2", "description": "解释说明2"}, + {"name": "变量名3", "description": "解释说明3"} + ], + "CONSTANT_CASE": [ + {"name": "变量名1", "description": "解释说明1"}, + {"name": "变量名2", "description": "解释说明2"}, + {"name": "变量名3", "description": "解释说明3"} + ] + } +} + +只返回JSON格式的结果,不要包含其他文字。`; +} + +// 调用GitHub Models API +async function callGitHubModelsAPI(prompt) { + try { + const response = await fetch(API_URL, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${GITHUB_TOKEN}` + }, + body: JSON.stringify({ + messages: [ + { + role: 'user', + content: prompt + } + ], + model: MODEL_NAME, + temperature: 0.7, + max_tokens: 1000 + }) + }); + + if (!response.ok) { + throw new Error(`API请求失败: ${response.status} ${response.statusText}`); + } + + const data = await response.json(); + return data.choices[0].message.content; + } catch (error) { + console.error('API调用错误:', error); + throw error; + } +} + +// 解析AI响应 +function parseAIResponse(response) { + try { + // 尝试直接解析JSON + const parsed = JSON.parse(response); + return parsed.suggestions || {}; + } catch (error) { + // 如果直接解析失败,尝试提取JSON部分 + const jsonMatch = response.match(/\{[\s\S]*\}/); + if (jsonMatch) { + try { + const parsed = JSON.parse(jsonMatch[0]); + return parsed.suggestions || {}; + } catch (e) { + console.error('JSON解析失败:', e); + } + } + + // 如果JSON解析失败,返回空对象 + console.error('无法解析AI响应:', response); + return {}; + } +} + + + +// 显示建议 +function displaySuggestions(suggestions) { + suggestionsContainer.innerHTML = ''; + + if (!suggestions || Object.keys(suggestions).length === 0) { + suggestionsContainer.innerHTML = '
暂无建议,请尝试重新生成
'; + return; + } + + // 命名规范的显示名称 + const conventionNames = { + 'camelCase': 'camelCase (驼峰命名法)', + 'PascalCase': 'PascalCase (帕斯卡命名法)', + 'snake_case': 'snake_case (下划线命名法)', + 'kebab-case': 'kebab-case (短横线命名法)', + 'CONSTANT_CASE': 'CONSTANT_CASE (常量命名法)' + }; + + // 按命名规范分组显示 + Object.keys(suggestions).forEach(convention => { + if (suggestions[convention] && suggestions[convention].length > 0) { + // 创建分组标题 + const groupTitle = document.createElement('div'); + groupTitle.className = 'convention-group-title'; + groupTitle.textContent = conventionNames[convention] || convention; + suggestionsContainer.appendChild(groupTitle); + + // 显示该规范下的建议 + suggestions[convention].forEach(suggestion => { + const suggestionElement = document.createElement('div'); + suggestionElement.className = 'suggestion-item'; + suggestionElement.innerHTML = ` +
${suggestion.name}
+
${suggestion.description}
+ + `; + suggestionsContainer.appendChild(suggestionElement); + }); + } + }); +} + +// 复制到剪贴板 +function copyToClipboard(text, button) { + navigator.clipboard.writeText(text).then(() => { + showSuccessToast('已复制到剪贴板'); + button.textContent = '已复制'; + setTimeout(() => { + button.textContent = '复制'; + }, 2000); + }).catch(err => { + console.error('复制失败:', err); + // 备用复制方法 + const textArea = document.createElement('textarea'); + textArea.value = text; + document.body.appendChild(textArea); + textArea.select(); + try { + document.execCommand('copy'); + showSuccessToast('已复制到剪贴板'); + button.textContent = '已复制'; + setTimeout(() => { + button.textContent = '复制'; + }, 2000); + } catch (e) { + showErrorMessage('复制失败,请手动复制'); + } + document.body.removeChild(textArea); + }); +} + +// 显示成功提示 +function showSuccessToast(message) { + const toast = document.createElement('div'); + toast.className = 'success-toast'; + toast.textContent = message; + document.body.appendChild(toast); + + setTimeout(() => { + toast.classList.add('show'); + }, 100); + + setTimeout(() => { + toast.classList.remove('show'); + setTimeout(() => { + document.body.removeChild(toast); + }, 300); + }, 2000); +} + +// 显示错误信息 +function showErrorMessage(message) { + const errorDiv = document.createElement('div'); + errorDiv.className = 'error'; + errorDiv.textContent = message; + suggestionsContainer.innerHTML = ''; + suggestionsContainer.appendChild(errorDiv); +} + +// 显示加载状态 +function showLoading(show) { + loadingDiv.style.display = show ? 'block' : 'none'; + generateBtn.disabled = show; + generateBtn.textContent = show ? '生成中...' : '生成变量名'; +} + +// 生成变量名建议 +async function generateSuggestions() { + const description = descriptionInput.value.trim(); + + if (!description) { + showErrorMessage('请输入变量描述'); + return; + } + + showLoading(true); + suggestionsContainer.innerHTML = ''; + + try { + const prompt = createNamingPrompt(description); + const response = await callGitHubModelsAPI(prompt); + const suggestions = parseAIResponse(response); + + displaySuggestions(suggestions); + } catch (error) { + console.error('生成建议失败:', error); + showErrorMessage(`生成失败: ${error.message}`); + } finally { + showLoading(false); + } +} + +// 事件监听器 +generateBtn.addEventListener('click', generateSuggestions); + +// 回车键生成 +descriptionInput.addEventListener('keypress', (e) => { + if (e.key === 'Enter' && !e.shiftKey) { + e.preventDefault(); + generateSuggestions(); + } +}); + +// 页面加载完成后的初始化 +document.addEventListener('DOMContentLoaded', () => { + // 设置默认占位符 + suggestionsContainer.innerHTML = '
请输入变量描述,然后点击生成按钮获取所有命名规范的建议
'; +}); + +// 导出函数供HTML调用 +window.copyToClipboard = copyToClipboard; +window.generateSuggestions = generateSuggestions; \ No newline at end of file diff --git a/frontend/aimodelapp/AI变量命名助手/styles.css b/frontend/aimodelapp/AI变量命名助手/styles.css new file mode 100644 index 00000000..3174cc43 --- /dev/null +++ b/frontend/aimodelapp/AI变量命名助手/styles.css @@ -0,0 +1,365 @@ +/* 全局样式重置 */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +/* 主体样式 */ +body { + font-family: 'Microsoft YaHei', '微软雅黑', 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + min-height: 100vh; + padding: 20px; + color: #333; + line-height: 1.6; +} + +/* 容器样式 */ +.container { + max-width: 700px; + margin: 0 auto; + background: rgba(255, 255, 255, 0.95); + border-radius: 20px; + padding: 30px; + box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1); + backdrop-filter: blur(10px); +} + +/* 头部样式 */ +.header { + text-align: center; + margin-bottom: 30px; +} + +.title { + font-size: 2.5rem; + color: #4a5568; + margin-bottom: 10px; + font-weight: 300; + letter-spacing: 2px; +} + +.subtitle { + color: #718096; + font-size: 1rem; + margin-bottom: 20px; +} + +/* 表单样式 */ +.form-section { + margin-bottom: 30px; +} + +.form-group { + margin-bottom: 25px; +} + +.form-label { + display: block; + margin-bottom: 8px; + font-weight: 500; + color: #4a5568; + font-size: 1rem; +} + +.form-input { + width: 100%; + padding: 15px; + border: 2px solid #e2e8f0; + border-radius: 12px; + font-size: 1rem; + transition: all 0.3s ease; + background: #f7fafc; + font-family: inherit; +} + +.form-input:focus { + outline: none; + border-color: #667eea; + background: #fff; + box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1); +} + +.textarea { + resize: vertical; + min-height: 120px; +} + +.select { + cursor: pointer; + appearance: none; + background-image: url('data:image/svg+xml;charset=US-ASCII,'); + background-repeat: no-repeat; + background-position: right 15px center; + background-size: 12px; + padding-right: 40px; +} + +/* 按钮样式 */ +.btn { + width: 100%; + padding: 15px; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + color: white; + border: none; + border-radius: 12px; + font-size: 1.1rem; + font-weight: 500; + cursor: pointer; + transition: all 0.3s ease; + margin-bottom: 25px; +} + +.btn:hover { + transform: translateY(-2px); + box-shadow: 0 10px 25px rgba(102, 126, 234, 0.3); +} + +.btn:active { + transform: translateY(0); +} + +.btn:disabled { + opacity: 0.6; + cursor: not-allowed; + transform: none; +} + +/* 结果区域样式 */ +.result-section { + margin-top: 30px; +} + +.result-title { + font-size: 1.3rem; + color: #4a5568; + margin-bottom: 15px; + text-align: center; + font-weight: 500; +} + +.loading { + display: none; + text-align: center; + color: #667eea; + font-style: italic; + padding: 20px; +} + +.suggestions-container { + background: #f7fafc; + border: 2px solid #e2e8f0; + border-radius: 12px; + padding: 20px; + min-height: 150px; +} + +.placeholder { + text-align: center; + color: #a0aec0; + font-style: italic; + padding: 40px 20px; +} + +/* 分组标题样式 */ +.convention-group-title { + font-size: 1.1rem; + font-weight: 600; + color: #4a5568; + margin: 20px 0 10px 0; + padding: 8px 12px; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + color: white; + border-radius: 8px; + text-align: center; +} + +.convention-group-title:first-child { + margin-top: 0; +} + +/* 建议项样式 */ +.suggestion-item { + background: #fff; + border: 1px solid #e2e8f0; + border-radius: 8px; + padding: 15px; + margin-bottom: 10px; + transition: all 0.2s ease; + cursor: pointer; + position: relative; +} + +.suggestion-item:hover { + border-color: #667eea; + box-shadow: 0 2px 8px rgba(102, 126, 234, 0.1); +} + +.suggestion-item:last-child { + margin-bottom: 0; +} + +.variable-name { + font-family: 'Consolas', 'Monaco', 'Courier New', monospace; + font-size: 1.1rem; + font-weight: 600; + color: #2d3748; + margin-bottom: 5px; +} + +.variable-description { + font-size: 0.9rem; + color: #718096; + line-height: 1.4; +} + +.copy-btn { + position: absolute; + top: 10px; + right: 10px; + background: #667eea; + color: white; + border: none; + border-radius: 6px; + padding: 5px 10px; + font-size: 0.8rem; + cursor: pointer; + opacity: 0; + transition: opacity 0.2s ease; +} + +.suggestion-item:hover .copy-btn { + opacity: 1; +} + +.copy-btn:hover { + background: #5a67d8; +} + +/* 错误样式 */ +.error { + color: #e53e3e; + background: #fed7d7; + border: 1px solid #feb2b2; + padding: 15px; + border-radius: 8px; + margin-top: 15px; +} + +/* 成功提示 */ +.success-toast { + position: fixed; + top: 20px; + right: 20px; + background: #48bb78; + color: white; + padding: 12px 20px; + border-radius: 8px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); + z-index: 1000; + opacity: 0; + transform: translateX(100%); + transition: all 0.3s ease; +} + +.success-toast.show { + opacity: 1; + transform: translateX(0); +} + +/* 响应式设计 */ +@media (max-width: 768px) { + body { + padding: 10px; + } + + .container { + padding: 20px; + margin: 10px; + } + + .title { + font-size: 2rem; + } + + .form-input { + padding: 12px; + } + + .btn { + padding: 12px; + } + + .suggestions-container { + padding: 15px; + } + + .suggestion-item { + padding: 12px; + } + + .copy-btn { + position: static; + opacity: 1; + margin-top: 8px; + width: 100%; + } +} + +@media (max-width: 480px) { + .title { + font-size: 1.8rem; + letter-spacing: 1px; + } + + .container { + padding: 15px; + } + + .form-input { + padding: 10px; + } + + .suggestion-item { + padding: 10px; + } + + .variable-name { + font-size: 1rem; + } + + .variable-description { + font-size: 0.85rem; + } +} + +/* 动画效果 */ +@keyframes fadeIn { + from { + opacity: 0; + transform: translateY(10px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.suggestion-item { + animation: fadeIn 0.3s ease; +} + +/* 加载动画 */ +@keyframes pulse { + 0%, 100% { + opacity: 1; + } + 50% { + opacity: 0.5; + } +} + +.loading { + animation: pulse 1.5s ease-in-out infinite; +} \ No newline at end of file diff --git a/frontend/aimodelapp/AI姓名评测/index.html b/frontend/aimodelapp/AI姓名评测/index.html new file mode 100644 index 00000000..a083c2f6 --- /dev/null +++ b/frontend/aimodelapp/AI姓名评测/index.html @@ -0,0 +1,56 @@ + + + + + + AI姓名评测 + + + +
+
+

AI姓名评测

+

智能分析姓名的稀有度、音韵美感与寓意内涵

+
+ +
+ + +
+ + + +
+

分析结果

+
正在分析中,请稍候...
+ +
+
+

稀有度评分

+
--%
+
点击"开始分析"查看结果
+
+ +
+

音韵评价

+
--%
+
点击"开始分析"查看结果
+
+ +
+

含义解读

+
点击"开始分析"查看姓名的深层寓意
+
+
+
+
+ + + + \ No newline at end of file diff --git a/frontend/aimodelapp/AI姓名评测/script.js b/frontend/aimodelapp/AI姓名评测/script.js new file mode 100644 index 00000000..1ddfd8b9 --- /dev/null +++ b/frontend/aimodelapp/AI姓名评测/script.js @@ -0,0 +1,291 @@ +// GitHub API 配置 +const GITHUB_TOKEN = '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'; +const endpoint = 'https://models.github.ai/inference/chat/completions'; +const model = 'deepseek/DeepSeek-V3-0324'; + +// DOM 元素 +const nameInput = document.getElementById('nameInput'); +const analyzeBtn = document.getElementById('analyzeBtn'); +const loading = document.getElementById('loading'); +const rarityScore = document.getElementById('rarityScore'); +const rarityDesc = document.getElementById('rarityDesc'); +const phoneticScore = document.getElementById('phoneticScore'); +const phoneticDesc = document.getElementById('phoneticDesc'); +const meaningAnalysis = document.getElementById('meaningAnalysis'); + +// 专业的姓名分析提示词 +const createNameAnalysisPrompt = (name) => { + return `你是一位专业的姓名学专家和语言学家,请对输入的姓名进行全面分析。请直接输出分析结果,不要包含任何思考过程或标签。 + +姓名:${name} + +请按照以下格式严格输出分析结果: + +【稀有度评分】 +评分:X% +评价:[对稀有度的详细说明,包括姓氏和名字的常见程度分析] + +【音韵评价】 +评分:X% +评价:[对音韵美感的分析,包括声调搭配、读音流畅度、音律和谐度等] + +【含义解读】 +[详细分析姓名的寓意内涵,包括: +1. 姓氏的历史渊源和文化背景 +2. 名字各字的含义和象征 +3. 整体姓名的寓意组合 +4. 可能体现的父母期望或文化内涵 +5. 与传统文化、诗词典故的关联等] + +要求: +1. 评分必须是1-100的整数百分比,要有明显区分度,避免雷同 +2. 分析要专业、客观、有依据,评分要根据实际情况有所差异 +3. 含义解读要详细深入,至少150字 +4. 严格按照上述格式输出,不要添加思考过程、标签或其他内容 +5. 如果是生僻字或罕见姓名,要特别说明 +6. 直接输出最终结果,不要显示推理过程`; +}; + +// 解析AI返回的分析结果 +function parseAnalysisResult(content) { + const result = { + rarityScore: '--%', + rarityDesc: '解析失败', + phoneticScore: '--%', + phoneticDesc: '解析失败', + meaningAnalysis: '解析失败' + }; + + try { + // 过滤掉DeepSeek的思考标签内容 + let cleanContent = content.replace(/[\s\S]*?<\/think>/gi, ''); + cleanContent = cleanContent.replace(/[\s\S]*$/gi, ''); // 处理未闭合的think标签 + cleanContent = cleanContent.trim(); + + console.log('清理后的内容:', cleanContent); + + // 提取稀有度评分(百分比格式) + const rarityMatch = cleanContent.match(/【稀有度评分】[\s\S]*?评分:(\d+)%[\s\S]*?评价:([\s\S]*?)(?=【|$)/); + if (rarityMatch) { + result.rarityScore = rarityMatch[1] + '%'; + result.rarityDesc = rarityMatch[2].trim(); + } + + // 提取音韵评价(百分比格式) + const phoneticMatch = cleanContent.match(/【音韵评价】[\s\S]*?评分:(\d+)%[\s\S]*?评价:([\s\S]*?)(?=【|$)/); + if (phoneticMatch) { + result.phoneticScore = phoneticMatch[1] + '%'; + result.phoneticDesc = phoneticMatch[2].trim(); + } + + // 提取含义解读 + const meaningMatch = cleanContent.match(/【含义解读】[\s\S]*?\n([\s\S]+)$/); + if (meaningMatch) { + result.meaningAnalysis = meaningMatch[1].trim(); + } + } catch (error) { + console.error('解析结果时出错:', error); + } + + return result; +} + +// 简单的markdown解析函数 +function parseMarkdown(text) { + if (!text || typeof text !== 'string') return text; + + // 处理加粗 **text** 或 __text__ + let parsed = text.replace(/\*\*(.*?)\*\*/g, '$1'); + parsed = parsed.replace(/__(.*?)__/g, '$1'); + + // 处理斜体 *text* 或 _text_ + parsed = parsed.replace(/\*(.*?)\*/g, '$1'); + parsed = parsed.replace(/_(.*?)_/g, '$1'); + + // 处理无序列表 + const lines = parsed.split('\n'); + let inList = false; + let result = []; + + for (let i = 0; i < lines.length; i++) { + const line = lines[i].trim(); + + // 检查是否是列表项(以 - 开头,后面跟空格) + if (line.match(/^-\s+/)) { + if (!inList) { + result.push('
    '); + inList = true; + } + // 移除开头的 "- " 并包装为
  • + const listContent = line.replace(/^-\s+/, ''); + result.push(`
  • ${listContent}
  • `); + } else { + if (inList) { + result.push('
'); + inList = false; + } + if (line) { + result.push(line); + } + } + } + + // 如果最后还在列表中,需要关闭列表 + if (inList) { + result.push(''); + } + + // 重新组合,用
连接非列表行 + parsed = result.join('
'); + + // 清理多余的
标签(在列表前后) + parsed = parsed.replace(/
    /g, '
      '); + parsed = parsed.replace(/<\/ul>
      /g, '
    '); + parsed = parsed.replace(/
  • /g, '
  • '); + parsed = parsed.replace(/<\/li>
    /g, '
  • '); + + return parsed; +} + +// 更新显示结果 +function updateResults(result) { + rarityScore.textContent = result.rarityScore; + rarityDesc.innerHTML = parseMarkdown(result.rarityDesc); + phoneticScore.textContent = result.phoneticScore; + phoneticDesc.innerHTML = parseMarkdown(result.phoneticDesc); + meaningAnalysis.innerHTML = parseMarkdown(result.meaningAnalysis); +} + +// 重置结果显示 +function resetResults() { + rarityScore.textContent = '--%'; + rarityDesc.innerHTML = '点击"开始分析"查看结果'; + phoneticScore.textContent = '--%'; + phoneticDesc.innerHTML = '点击"开始分析"查看结果'; + meaningAnalysis.innerHTML = '点击"开始分析"查看姓名的深层寓意'; +} + +// 显示错误信息 +function showError(message) { + // 清除之前的错误信息 + const existingError = document.querySelector('.error'); + if (existingError) { + existingError.remove(); + } + + // 创建新的错误信息 + const errorDiv = document.createElement('div'); + errorDiv.className = 'error'; + errorDiv.textContent = `分析失败:${message}。`; + document.querySelector('.result-section').appendChild(errorDiv); +} + +// 姓名验证 +function validateName(name) { + if (!name) { + return '请输入姓名'; + } + if (name.length < 2) { + return '姓名至少需要2个字符'; + } + if (name.length > 10) { + return '姓名不能超过10个字符'; + } + if (!/^[\u4e00-\u9fa5a-zA-Z]+$/.test(name)) { + return '姓名只能包含中文或英文字符'; + } + return null; +} + +// 主要分析函数 +async function analyzeName() { + const name = nameInput.value.trim(); + + // 验证输入 + const validationError = validateName(name); + if (validationError) { + alert(validationError); + return; + } + + // 显示加载状态 + analyzeBtn.disabled = true; + analyzeBtn.textContent = '分析中...'; + loading.style.display = 'block'; + resetResults(); + + // 清除之前的错误信息 + const existingError = document.querySelector('.error'); + if (existingError) { + existingError.remove(); + } + + const requestBody = { + model: model, + messages: [{ + role: "user", + content: createNameAnalysisPrompt(name) + }], + temperature: 0.7, + max_tokens: 1000 + }; + + try { + const response = await fetch(endpoint, { + method: 'POST', + headers: { + 'Accept': 'application/vnd.github+json', + 'Authorization': `Bearer ${GITHUB_TOKEN}`, + 'X-GitHub-Api-Version': '2022-11-28', + 'Content-Type': 'application/json' + }, + body: JSON.stringify(requestBody) + }); + + // 检查HTTP状态码 + if (response.status === 429) { + throw new Error('短时间内请求次数过多,请休息一下!'); + } + + if (!response.ok) { + throw new Error(`请求失败: ${response.status} ${response.statusText}`); + } + + const data = await response.json(); + + if (data?.choices?.[0]?.message?.content) { + const analysisResult = parseAnalysisResult(data.choices[0].message.content.trim()); + updateResults(analysisResult); + } else { + throw new Error('AI响应格式异常'); + } + } catch (error) { + console.error('分析姓名时出错:', error); + showError(error.message); + resetResults(); + } finally { + // 恢复按钮状态 + analyzeBtn.disabled = false; + analyzeBtn.textContent = '开始分析'; + loading.style.display = 'none'; + } +} + +// 事件监听器 +analyzeBtn.addEventListener('click', analyzeName); + +// 回车键快捷分析 +nameInput.addEventListener('keypress', (e) => { + if (e.key === 'Enter') { + e.preventDefault(); + analyzeName(); + } +}); + +// 输入框内容变化时清除错误信息 +nameInput.addEventListener('input', () => { + const existingError = document.querySelector('.error'); + if (existingError) { + existingError.remove(); + } +}); \ No newline at end of file diff --git a/frontend/aimodelapp/AI姓名评测/styles.css b/frontend/aimodelapp/AI姓名评测/styles.css new file mode 100644 index 00000000..dc1325ec --- /dev/null +++ b/frontend/aimodelapp/AI姓名评测/styles.css @@ -0,0 +1,249 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: 'Microsoft YaHei', '微软雅黑', Arial, sans-serif; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + min-height: 100vh; + padding: 20px; + color: #333; +} + +.container { + max-width: 700px; + margin: 0 auto; + background: rgba(255, 255, 255, 0.95); + border-radius: 20px; + padding: 30px; + box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1); + backdrop-filter: blur(10px); +} + +.header { + text-align: center; + margin-bottom: 30px; +} + +.title { + font-size: 2.5rem; + color: #4a5568; + margin-bottom: 10px; + font-weight: 300; + letter-spacing: 2px; +} + +.subtitle { + color: #718096; + font-size: 1rem; + margin-bottom: 20px; +} + +.form-group { + margin-bottom: 25px; +} + +.form-label { + display: block; + margin-bottom: 8px; + font-weight: 500; + color: #4a5568; + font-size: 1rem; +} + +.form-input { + width: 100%; + padding: 15px; + border: 2px solid #e2e8f0; + border-radius: 12px; + font-size: 1rem; + transition: all 0.3s ease; + background: #f7fafc; + text-align: center; +} + +.form-input:focus { + outline: none; + border-color: #667eea; + background: #fff; + box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1); +} + +.btn { + width: 100%; + padding: 15px; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + color: white; + border: none; + border-radius: 12px; + font-size: 1.1rem; + font-weight: 500; + cursor: pointer; + transition: all 0.3s ease; + margin-bottom: 25px; +} + +.btn:hover { + transform: translateY(-2px); + box-shadow: 0 10px 25px rgba(102, 126, 234, 0.3); +} + +.btn:active { + transform: translateY(0); +} + +.btn:disabled { + opacity: 0.6; + cursor: not-allowed; + transform: none; +} + +.result-section { + margin-top: 30px; +} + +.result-title { + font-size: 1.3rem; + color: #4a5568; + margin-bottom: 20px; + text-align: center; + font-weight: 500; +} + +.loading { + display: none; + text-align: center; + color: #667eea; + font-style: italic; + margin-bottom: 20px; +} + +.result-container { + display: grid; + gap: 20px; + grid-template-columns: 1fr; +} + +.result-card { + background: #f7fafc; + border: 2px solid #e2e8f0; + border-radius: 12px; + padding: 20px; + transition: all 0.3s ease; +} + +.result-card:hover { + border-color: #667eea; + box-shadow: 0 5px 15px rgba(102, 126, 234, 0.1); +} + +.card-title { + font-size: 1.1rem; + color: #4a5568; + margin-bottom: 15px; + text-align: center; + font-weight: 600; +} + +.score-display { + font-size: 2.5rem; + font-weight: bold; + text-align: center; + margin-bottom: 10px; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; +} + +.score-desc { + text-align: center; + color: #718096; + font-size: 0.9rem; + line-height: 1.5; +} + +.meaning-content { + color: #2d3748; + line-height: 1.8; + font-size: 1rem; + text-align: left; + white-space: pre-wrap; +} + +.error { + color: #e53e3e; + background: #fed7d7; + border: 1px solid #feb2b2; + padding: 15px; + border-radius: 8px; + margin-top: 15px; +} + +/* 平板和桌面端优化 */ +@media (min-width: 768px) { + .result-container { + grid-template-columns: 1fr 1fr; + } + + .result-card:last-child { + grid-column: 1 / -1; + } +} + +/* 手机端优化 */ +@media (max-width: 768px) { + body { + padding: 10px; + } + + .container { + padding: 20px; + margin: 10px; + } + + .title { + font-size: 2rem; + } + + .form-input { + padding: 12px; + } + + .btn { + padding: 12px; + } + + .result-card { + padding: 15px; + } + + .score-display { + font-size: 2rem; + } +} + +@media (max-width: 480px) { + .title { + font-size: 1.8rem; + letter-spacing: 1px; + } + + .container { + padding: 15px; + } + + .result-card { + padding: 12px; + } + + .score-display { + font-size: 1.8rem; + } + + .meaning-content { + font-size: 0.9rem; + } +} \ No newline at end of file diff --git a/frontend/aimodelapp/生成要求.txt b/frontend/aimodelapp/生成要求.txt new file mode 100644 index 00000000..d921a0c2 --- /dev/null +++ b/frontend/aimodelapp/生成要求.txt @@ -0,0 +1,12 @@ +1.写一个静态网页来调用github model 来完成应用功能 +2.网页清新风格,颜色随意,app风格,适配手机端和电脑端,优先优化手机端用户体验 +3.默认github的调用密钥是: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 +4.默认调用AI模型为 "openai/gpt-4o-mini" +5.把js,css,html分开储存,每个功能分每个模块,避免单个文件过大问题 +6.默认github ai调用模型地址是:'https://models.github.ai/inference/chat/completions' +比如这样: +// GitHub API 配置 +const GITHUB_TOKEN = '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'; +const endpoint = 'https://models.github.ai/inference/chat/completions'; +const model = 'deepseek/DeepSeek-V3-0324'; + diff --git a/frontend/react-app/public/60sapi/娱乐消遣/随机JavaScript趣味题/css/background.css b/frontend/react-app/public/60sapi/娱乐消遣/随机JavaScript趣味题/css/background.css deleted file mode 100644 index 7a44dec9..00000000 --- a/frontend/react-app/public/60sapi/娱乐消遣/随机JavaScript趣味题/css/background.css +++ /dev/null @@ -1,190 +0,0 @@ -/* 背景样式文件 */ - -/* 主体背景 */ -body { - background: linear-gradient(135deg, #e8f5e8 0%, #c8e6c9 50%, #a5d6a7 100%); - background-attachment: fixed; - background-size: 400% 400%; - animation: gradientShift 15s ease infinite; -} - -/* 背景动画 */ -@keyframes gradientShift { - 0% { - background-position: 0% 50%; - } - 50% { - background-position: 100% 50%; - } - 100% { - background-position: 0% 50%; - } -} - -/* 装饰性背景元素 */ -body::before { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - radial-gradient(circle at 20% 80%, rgba(76, 175, 80, 0.1) 0%, transparent 50%), - radial-gradient(circle at 80% 20%, rgba(129, 199, 132, 0.1) 0%, transparent 50%), - radial-gradient(circle at 40% 40%, rgba(165, 214, 167, 0.08) 0%, transparent 50%); - pointer-events: none; - z-index: -1; -} - -/* 浮动装饰圆点 */ -body::after { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - radial-gradient(2px 2px at 20px 30px, rgba(76, 175, 80, 0.3), transparent), - radial-gradient(2px 2px at 40px 70px, rgba(129, 199, 132, 0.2), transparent), - radial-gradient(1px 1px at 90px 40px, rgba(165, 214, 167, 0.3), transparent), - radial-gradient(1px 1px at 130px 80px, rgba(76, 175, 80, 0.2), transparent), - radial-gradient(2px 2px at 160px 30px, rgba(129, 199, 132, 0.3), transparent); - background-repeat: repeat; - background-size: 200px 100px; - animation: float 20s linear infinite; - pointer-events: none; - z-index: -1; - opacity: 0.6; -} - -@keyframes float { - 0% { - transform: translateY(0px); - } - 50% { - transform: translateY(-10px); - } - 100% { - transform: translateY(0px); - } -} - -/* 题目容器背景增强 */ -.question-container { - background: rgba(255, 255, 255, 0.95); - backdrop-filter: blur(10px); - -webkit-backdrop-filter: blur(10px); - border: 1px solid rgba(255, 255, 255, 0.2); - box-shadow: - 0 8px 32px rgba(26, 77, 26, 0.1), - inset 0 1px 0 rgba(255, 255, 255, 0.2); -} - -/* 错误容器背景 */ -.error-container { - background: rgba(255, 255, 255, 0.95); - backdrop-filter: blur(10px); - -webkit-backdrop-filter: blur(10px); -} - -/* 结果容器背景 */ -.result-container { - background: rgba(255, 255, 255, 0.9); - backdrop-filter: blur(5px); - -webkit-backdrop-filter: blur(5px); -} - -/* 代码块背景 */ -.code-block { - background: rgba(248, 249, 250, 0.9); - backdrop-filter: blur(5px); - -webkit-backdrop-filter: blur(5px); -} - -/* 选项背景 */ -.option { - background: rgba(255, 255, 255, 0.8); - backdrop-filter: blur(5px); - -webkit-backdrop-filter: blur(5px); -} - -.option:hover { - background: rgba(76, 175, 80, 0.05); -} - -.option.selected { - background: linear-gradient(135deg, rgba(76, 175, 80, 0.15), rgba(76, 175, 80, 0.08)); -} - -/* 按钮背景增强 */ -.submit-btn { - background: linear-gradient(135deg, #4caf50, #45a049); - box-shadow: 0 4px 15px rgba(76, 175, 80, 0.2); -} - -.show-answer-btn { - background: linear-gradient(135deg, #2196f3, #1976d2); - box-shadow: 0 4px 15px rgba(33, 150, 243, 0.2); -} - -.retry-btn { - background: linear-gradient(135deg, #ff9800, #f57c00); - box-shadow: 0 4px 15px rgba(255, 152, 0, 0.2); -} - -.refresh-btn { - background: linear-gradient(135deg, #4caf50, #45a049); - box-shadow: 0 4px 15px rgba(76, 175, 80, 0.2); -} - -/* 移动端背景优化 */ -@media (max-width: 768px) { - body { - background-attachment: scroll; - } - - body::after { - opacity: 0.4; - background-size: 150px 75px; - } - - .question-container { - backdrop-filter: blur(8px); - -webkit-backdrop-filter: blur(8px); - } -} - -/* 高对比度模式支持 */ -@media (prefers-contrast: high) { - body { - background: #f0f8f0; - } - - body::before, - body::after { - display: none; - } - - .question-container { - background: #ffffff; - border: 2px solid #4caf50; - } -} - -/* 减少动画模式支持 */ -@media (prefers-reduced-motion: reduce) { - body { - animation: none; - background: #e8f5e8; - } - - body::after { - animation: none; - } - - .refresh-btn:hover { - transform: scale(1.1); - } -} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/娱乐消遣/随机JavaScript趣味题/css/style.css b/frontend/react-app/public/60sapi/娱乐消遣/随机JavaScript趣味题/css/style.css deleted file mode 100644 index 2ad05653..00000000 --- a/frontend/react-app/public/60sapi/娱乐消遣/随机JavaScript趣味题/css/style.css +++ /dev/null @@ -1,597 +0,0 @@ -/* 基础样式重置 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif; - line-height: 1.6; - color: #2d5a27; - min-height: 100vh; - overflow-x: hidden; -} - -/* 容器布局 */ -.container { - max-width: 1200px; - margin: 0 auto; - padding: 20px; - min-height: 100vh; - display: flex; - flex-direction: column; -} - -/* 头部样式 */ -.header { - text-align: center; - margin-bottom: 40px; - padding: 30px 0; -} - -.header h1 { - font-size: 2.5rem; - color: #1a4d1a; - margin-bottom: 10px; - font-weight: 700; - text-shadow: 0 2px 4px rgba(26, 77, 26, 0.1); -} - -.subtitle { - font-size: 1.1rem; - color: #4a7c59; - opacity: 0.8; -} - -/* 主内容区域 */ -.main-content { - flex: 1; - display: flex; - justify-content: center; - align-items: flex-start; -} - -/* 加载动画 */ -.loading { - text-align: center; - padding: 60px 20px; -} - -.spinner { - width: 50px; - height: 50px; - border: 4px solid #e8f5e8; - border-top: 4px solid #4caf50; - border-radius: 50%; - animation: spin 1s linear infinite; - margin: 0 auto 20px; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -.loading p { - color: #4a7c59; - font-size: 1.1rem; -} - -/* 题目容器 */ -.question-container { - background: rgba(255, 255, 255, 0.95); - border-radius: 20px; - padding: 40px; - box-shadow: 0 10px 30px rgba(26, 77, 26, 0.1); - border: 2px solid rgba(76, 175, 80, 0.2); - width: 100%; - max-width: 800px; - backdrop-filter: blur(10px); -} - -/* 题目头部 */ -.question-header { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 30px; - padding-bottom: 15px; - border-bottom: 2px solid #e8f5e8; -} - -.question-id { - font-size: 1.1rem; - color: #4caf50; - font-weight: 600; - background: linear-gradient(135deg, #e8f5e8, #c8e6c9); - padding: 8px 16px; - border-radius: 20px; -} - -.refresh-btn { - background: linear-gradient(135deg, #4caf50, #45a049); - border: none; - border-radius: 50%; - width: 45px; - height: 45px; - color: white; - cursor: pointer; - transition: all 0.3s ease; - display: flex; - align-items: center; - justify-content: center; -} - -.refresh-btn:hover { - transform: rotate(180deg) scale(1.1); - box-shadow: 0 5px 15px rgba(76, 175, 80, 0.3); -} - -/* 题目文本 */ -.question-text h2 { - font-size: 1.5rem; - color: #1a4d1a; - margin-bottom: 25px; - text-align: center; -} - -/* 代码块 */ -.code-block { - background: #f8f9fa; - border: 2px solid #e8f5e8; - border-radius: 12px; - margin: 25px 0; - overflow-x: auto; - position: relative; -} - -.code-block pre { - margin: 0; - padding: 25px; - font-family: 'Consolas', 'Monaco', 'Courier New', monospace; - font-size: 0.95rem; - line-height: 1.5; - color: #2d5a27; - white-space: pre-wrap; - word-wrap: break-word; - background: transparent !important; -} - -.code-block code { - font-family: 'Consolas', 'Monaco', 'Courier New', monospace; - background: transparent !important; -} - -/* 代码高亮自定义样式 - 丰富的语法高亮 */ -.code-block .hljs { - background: transparent !important; - color: #333333 !important; -} - -/* JavaScript 关键字 - 蓝色 */ -.code-block .hljs-keyword { - color: #0066cc !important; - font-weight: 600; -} - -/* 字符串 - 绿色 */ -.code-block .hljs-string { - color: #22aa22 !important; -} - -/* 数字 - 橙色 */ -.code-block .hljs-number { - color: #ff6600 !important; -} - -/* 函数名 - 紫色 */ -.code-block .hljs-function, -.code-block .hljs-title.function_ { - color: #9933cc !important; - font-weight: 600; -} - -/* 变量名 - 深蓝色 */ -.code-block .hljs-variable, -.code-block .hljs-name { - color: #0066aa !important; -} - -/* 注释 - 灰色 */ -.code-block .hljs-comment { - color: #888888 !important; - font-style: italic; -} - -/* 内置对象和方法 - 深紫色 */ -.code-block .hljs-built_in { - color: #663399 !important; - font-weight: 500; -} - -/* 字面量 (true, false, null) - 红色 */ -.code-block .hljs-literal { - color: #cc0000 !important; - font-weight: 600; -} - -/* 操作符 - 深灰色 */ -.code-block .hljs-operator { - color: #666666 !important; -} - -/* 标点符号 - 深灰色 */ -.code-block .hljs-punctuation { - color: #666666 !important; -} - -/* 属性名 - 深蓝色 */ -.code-block .hljs-property, -.code-block .hljs-attr { - color: #0066aa !important; -} - -/* 类名和构造函数 - 深绿色 */ -.code-block .hljs-title.class_, -.code-block .hljs-title { - color: #228833 !important; - font-weight: 600; -} - -/* 参数 - 深蓝色 */ -.code-block .hljs-params { - color: #0066aa !important; -} - -/* 正则表达式 - 深红色 */ -.code-block .hljs-regexp { - color: #aa0066 !important; -} - -/* 模板字符串 - 深绿色 */ -.code-block .hljs-template-variable, -.code-block .hljs-template-tag { - color: #228833 !important; -} - -/* 选项容器 */ -.options-container { - margin: 30px 0; -} - -.option { - background: rgba(255, 255, 255, 0.8); - border: 2px solid #e8f5e8; - border-radius: 12px; - padding: 15px 20px; - margin: 12px 0; - cursor: pointer; - transition: all 0.3s ease; - font-size: 1rem; - position: relative; - overflow: hidden; -} - -.option:hover { - border-color: #4caf50; - background: rgba(76, 175, 80, 0.05); - transform: translateX(5px); -} - -.option.selected { - border-color: #4caf50; - background: linear-gradient(135deg, rgba(76, 175, 80, 0.1), rgba(76, 175, 80, 0.05)); - color: #1a4d1a; - font-weight: 600; -} - -.option.correct { - border-color: #4caf50; - background: linear-gradient(135deg, rgba(76, 175, 80, 0.2), rgba(76, 175, 80, 0.1)); - color: #1a4d1a; -} - -.option.incorrect { - border-color: #f44336; - background: linear-gradient(135deg, rgba(244, 67, 54, 0.1), rgba(244, 67, 54, 0.05)); - color: #c62828; -} - -/* 按钮样式 */ -.action-buttons { - display: flex; - gap: 15px; - margin: 30px 0; - justify-content: center; - flex-wrap: wrap; -} - -.submit-btn, .show-answer-btn, .retry-btn, .export-btn { - padding: 12px 30px; - border: none; - border-radius: 25px; - font-size: 1rem; - font-weight: 600; - cursor: pointer; - transition: all 0.3s ease; - min-width: 120px; - display: flex; - align-items: center; - justify-content: center; - gap: 8px; -} - -.submit-btn { - background: linear-gradient(135deg, #4caf50, #45a049); - color: white; -} - -.submit-btn:hover:not(:disabled) { - transform: translateY(-2px); - box-shadow: 0 5px 15px rgba(76, 175, 80, 0.3); -} - -.submit-btn:disabled { - background: #cccccc; - cursor: not-allowed; - transform: none; - box-shadow: none; -} - -.show-answer-btn { - background: linear-gradient(135deg, #2196f3, #1976d2); - color: white; -} - -.show-answer-btn:hover { - transform: translateY(-2px); - box-shadow: 0 5px 15px rgba(33, 150, 243, 0.3); -} - -.retry-btn { - background: linear-gradient(135deg, #ff9800, #f57c00); - color: white; -} - -.retry-btn:hover { - transform: translateY(-2px); - box-shadow: 0 5px 15px rgba(255, 152, 0, 0.3); -} - -.export-btn { - background: linear-gradient(135deg, #9c27b0, #7b1fa2); - color: white; -} - -.export-btn:hover { - transform: translateY(-2px); - box-shadow: 0 5px 15px rgba(156, 39, 176, 0.3); -} - -.export-btn svg { - width: 16px; - height: 16px; -} - -/* 结果容器 */ -.result-container { - margin-top: 30px; - padding: 25px; - background: rgba(255, 255, 255, 0.9); - border-radius: 15px; - border: 2px solid #e8f5e8; -} - -.result-header { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 20px; - padding-bottom: 15px; - border-bottom: 1px solid #e8f5e8; -} - -.result-status { - font-size: 1.2rem; - font-weight: 600; -} - -.result-status.correct { - color: #4caf50; -} - -.result-status.incorrect { - color: #f44336; -} - -.correct-answer { - font-weight: 600; - color: #4caf50; - background: rgba(76, 175, 80, 0.1); - padding: 5px 12px; - border-radius: 15px; -} - -.explanation { - color: #2d5a27; - line-height: 1.7; - font-size: 1rem; -} - -.explanation pre { - background: #f8f9fa; - border: 1px solid #e8f5e8; - border-radius: 8px; - padding: 15px; - margin: 15px 0; - overflow-x: auto; - font-family: 'Consolas', 'Monaco', 'Courier New', monospace; -} - -/* 错误容器 */ -.error-container { - text-align: center; - padding: 60px 20px; - background: rgba(255, 255, 255, 0.9); - border-radius: 20px; - border: 2px solid rgba(244, 67, 54, 0.2); - max-width: 500px; - margin: 0 auto; -} - -.error-icon { - font-size: 3rem; - margin-bottom: 20px; -} - -.error-container h3 { - color: #f44336; - margin-bottom: 15px; - font-size: 1.5rem; -} - -.error-container p { - color: #666; - margin-bottom: 25px; - font-size: 1.1rem; -} - -/* 底部 */ -.footer { - text-align: center; - padding: 30px 0; - margin-top: 40px; - color: #4a7c59; - opacity: 0.7; - border-top: 1px solid rgba(76, 175, 80, 0.2); -} - -/* 平板端适配 (768px - 1024px) */ -@media (max-width: 1024px) and (min-width: 768px) { - .container { - padding: 15px; - } - - .header h1 { - font-size: 2.2rem; - } - - .question-container { - padding: 30px; - } - - .action-buttons { - flex-wrap: wrap; - } -} - -/* 手机端适配 (最大768px) */ -@media (max-width: 768px) { - .container { - padding: 10px; - } - - .header { - margin-bottom: 25px; - padding: 20px 0; - } - - .header h1 { - font-size: 1.8rem; - } - - .subtitle { - font-size: 1rem; - } - - .question-container { - padding: 20px; - border-radius: 15px; - } - - .question-header { - flex-direction: column; - gap: 15px; - text-align: center; - } - - .question-text h2 { - font-size: 1.3rem; - } - - .code-block pre { - padding: 15px; - font-size: 0.85rem; - } - - .option { - padding: 12px 15px; - font-size: 0.95rem; - } - - .action-buttons { - flex-direction: column; - align-items: center; - } - - .submit-btn, .show-answer-btn, .retry-btn { - width: 100%; - max-width: 200px; - } - - .result-header { - flex-direction: column; - gap: 10px; - text-align: center; - } - - .explanation { - font-size: 0.95rem; - } - - .explanation pre { - padding: 10px; - font-size: 0.8rem; - } -} - -/* 小屏手机适配 (最大480px) */ -@media (max-width: 480px) { - .container { - padding: 8px; - } - - .header h1 { - font-size: 1.6rem; - } - - .question-container { - padding: 15px; - } - - .question-id { - font-size: 1rem; - padding: 6px 12px; - } - - .refresh-btn { - width: 40px; - height: 40px; - } - - .code-block pre { - font-size: 0.8rem; - padding: 12px; - } - - .option { - padding: 10px 12px; - font-size: 0.9rem; - } - - .submit-btn, .show-answer-btn, .retry-btn { - padding: 10px 20px; - font-size: 0.95rem; - } -} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/娱乐消遣/随机JavaScript趣味题/index.html b/frontend/react-app/public/60sapi/娱乐消遣/随机JavaScript趣味题/index.html deleted file mode 100644 index 310880a4..00000000 --- a/frontend/react-app/public/60sapi/娱乐消遣/随机JavaScript趣味题/index.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - 随机JavaScript趣味题 - - - - - - - -
    -
    -

    JavaScript趣味题

    -

    测试你的JavaScript知识

    -
    - -
    -
    -
    -

    正在加载题目...

    -
    - - - - -
    - -
    -

    JavaScript趣味题集合

    -
    -
    - - - - \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/娱乐消遣/随机JavaScript趣味题/js/script.js b/frontend/react-app/public/60sapi/娱乐消遣/随机JavaScript趣味题/js/script.js deleted file mode 100644 index dd4812c0..00000000 --- a/frontend/react-app/public/60sapi/娱乐消遣/随机JavaScript趣味题/js/script.js +++ /dev/null @@ -1,565 +0,0 @@ -// JavaScript趣味题应用 -class JSQuizApp { - constructor() { - this.apiEndpoints = [ - 'https://60s-cf.viki.moe', - 'https://60s.viki.moe', - 'https://60s.b23.run', - 'https://60s.114128.xyz', - 'https://60s-cf.114128.xyz' - ]; - this.currentApiIndex = 0; - this.currentQuestion = null; - this.selectedOption = null; - this.isAnswered = false; - - this.initElements(); - this.bindEvents(); - this.loadQuestion(); - } - - // 初始化DOM元素 - initElements() { - this.elements = { - loading: document.getElementById('loading'), - questionContainer: document.getElementById('questionContainer'), - errorContainer: document.getElementById('errorContainer'), - questionId: document.getElementById('questionId'), - questionText: document.getElementById('questionText'), - codeContent: document.getElementById('codeContent'), - optionsContainer: document.getElementById('optionsContainer'), - submitBtn: document.getElementById('submitBtn'), - showAnswerBtn: document.getElementById('showAnswerBtn'), - refreshBtn: document.getElementById('refreshBtn'), - retryBtn: document.getElementById('retryBtn'), - exportBtn: document.getElementById('exportBtn'), - resultContainer: document.getElementById('resultContainer'), - resultStatus: document.getElementById('resultStatus'), - correctAnswer: document.getElementById('correctAnswer'), - explanation: document.getElementById('explanation'), - errorMessage: document.getElementById('errorMessage') - }; - } - - // 绑定事件 - bindEvents() { - this.elements.submitBtn.addEventListener('click', () => this.submitAnswer()); - this.elements.showAnswerBtn.addEventListener('click', () => this.showAnswer()); - this.elements.refreshBtn.addEventListener('click', () => this.loadQuestion()); - this.elements.retryBtn.addEventListener('click', () => this.loadQuestion()); - this.elements.exportBtn.addEventListener('click', () => this.exportToMarkdown()); - } - - // 显示加载状态 - showLoading() { - this.elements.loading.style.display = 'block'; - this.elements.questionContainer.style.display = 'none'; - this.elements.errorContainer.style.display = 'none'; - } - - // 显示题目 - showQuestion() { - this.elements.loading.style.display = 'none'; - this.elements.questionContainer.style.display = 'block'; - this.elements.errorContainer.style.display = 'none'; - } - - // 显示错误 - showError(message) { - this.elements.loading.style.display = 'none'; - this.elements.questionContainer.style.display = 'none'; - this.elements.errorContainer.style.display = 'block'; - this.elements.errorMessage.textContent = message; - } - - // 获取当前API地址 - getCurrentApiUrl() { - return `${this.apiEndpoints[this.currentApiIndex]}/v2/awesome-js`; - } - - // 切换到下一个API - switchToNextApi() { - this.currentApiIndex = (this.currentApiIndex + 1) % this.apiEndpoints.length; - } - - // 加载题目 - async loadQuestion() { - this.showLoading(); - this.resetQuestion(); - - let attempts = 0; - const maxAttempts = this.apiEndpoints.length; - - while (attempts < maxAttempts) { - try { - const response = await fetch(this.getCurrentApiUrl(), { - method: 'GET', - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - }, - timeout: 10000 - }); - - if (!response.ok) { - throw new Error(`HTTP ${response.status}: ${response.statusText}`); - } - - const data = await response.json(); - - if (data.code === 200 && data.data) { - this.currentQuestion = data.data; - this.displayQuestion(); - return; - } else { - throw new Error(data.message || '数据格式错误'); - } - - } catch (error) { - console.warn(`API ${this.getCurrentApiUrl()} 请求失败:`, error.message); - attempts++; - - if (attempts < maxAttempts) { - this.switchToNextApi(); - console.log(`切换到备用API: ${this.getCurrentApiUrl()}`); - } else { - this.showError(`所有API接口都无法访问,请检查网络连接后重试。\n最后尝试的错误: ${error.message}`); - return; - } - } - } - } - - // 重置题目状态 - resetQuestion() { - this.selectedOption = null; - this.isAnswered = false; - this.elements.resultContainer.style.display = 'none'; - this.elements.submitBtn.disabled = true; - this.elements.submitBtn.textContent = '提交答案'; - this.elements.showAnswerBtn.style.display = 'inline-block'; - - // 清空选项容器,防止重复显示 - this.elements.optionsContainer.innerHTML = ''; - - // 移除所有选项的事件监听器 - const existingOptions = document.querySelectorAll('.option'); - existingOptions.forEach(option => { - option.removeEventListener('click', this.selectOption); - }); - } - - // 显示题目内容 - displayQuestion() { - const question = this.currentQuestion; - - console.log('显示题目:', question); - - // 设置题目ID - this.elements.questionId.textContent = `题目 #${question.id}`; - - // 设置题目文本 - this.elements.questionText.innerHTML = `

    ${this.escapeHtml(question.question)}

    `; - - // 设置代码内容并应用语法高亮 - this.elements.codeContent.textContent = question.code; - - // 应用语法高亮 - if (typeof hljs !== 'undefined') { - hljs.highlightElement(this.elements.codeContent); - } - - // 确保选项容器已清空 - this.elements.optionsContainer.innerHTML = ''; - - // 生成选项 - this.generateOptions(question.options); - - this.showQuestion(); - } - - // 生成选项 - generateOptions(options) { - // 确保清空容器 - this.elements.optionsContainer.innerHTML = ''; - - // 验证选项数据 - if (!Array.isArray(options) || options.length === 0) { - console.error('选项数据无效:', options); - return; - } - - // 移除可能存在的重复选项 - const uniqueOptions = [...new Set(options)]; - - uniqueOptions.forEach((option, index) => { - const optionElement = document.createElement('div'); - optionElement.className = 'option'; - optionElement.textContent = option; - optionElement.dataset.index = index; - optionElement.dataset.value = option.charAt(0); // A, B, C, D - - optionElement.addEventListener('click', () => this.selectOption(optionElement)); - - this.elements.optionsContainer.appendChild(optionElement); - }); - - console.log('生成选项:', uniqueOptions); - } - - // 选择选项 - selectOption(optionElement) { - if (this.isAnswered) return; - - // 移除之前的选中状态 - document.querySelectorAll('.option.selected').forEach(el => { - el.classList.remove('selected'); - }); - - // 设置当前选中 - optionElement.classList.add('selected'); - this.selectedOption = optionElement.dataset.value; - - // 启用提交按钮 - this.elements.submitBtn.disabled = false; - } - - // 提交答案 - submitAnswer() { - if (!this.selectedOption || this.isAnswered) return; - - this.isAnswered = true; - this.elements.submitBtn.disabled = true; - this.elements.submitBtn.textContent = '已提交'; - this.elements.showAnswerBtn.style.display = 'none'; - - const isCorrect = this.selectedOption === this.currentQuestion.answer; - - // 显示结果 - this.showResult(isCorrect); - - // 标记选项 - this.markOptions(); - } - - // 显示答案 - showAnswer() { - this.isAnswered = true; - this.elements.submitBtn.disabled = true; - this.elements.submitBtn.textContent = '已显示答案'; - this.elements.showAnswerBtn.style.display = 'none'; - - // 显示结果(不判断对错) - this.showResult(null); - - // 标记正确答案 - this.markCorrectAnswer(); - } - - // 显示结果 - showResult(isCorrect) { - const resultContainer = this.elements.resultContainer; - const resultStatus = this.elements.resultStatus; - const correctAnswer = this.elements.correctAnswer; - const explanation = this.elements.explanation; - - // 设置结果状态 - if (isCorrect === true) { - resultStatus.textContent = '✅ 回答正确!'; - resultStatus.className = 'result-status correct'; - } else if (isCorrect === false) { - resultStatus.textContent = '❌ 回答错误'; - resultStatus.className = 'result-status incorrect'; - } else { - resultStatus.textContent = '💡 答案解析'; - resultStatus.className = 'result-status'; - } - - // 设置正确答案 - correctAnswer.textContent = `正确答案: ${this.currentQuestion.answer}`; - - // 设置解析内容 - explanation.innerHTML = this.formatExplanation(this.currentQuestion.explanation); - - // 显示结果容器 - resultContainer.style.display = 'block'; - - // 滚动到结果区域 - setTimeout(() => { - resultContainer.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); - }, 100); - } - - // 标记选项 - markOptions() { - const options = document.querySelectorAll('.option'); - const correctAnswer = this.currentQuestion.answer; - - options.forEach(option => { - const optionValue = option.dataset.value; - - if (optionValue === correctAnswer) { - option.classList.add('correct'); - } else if (option.classList.contains('selected')) { - option.classList.add('incorrect'); - } - - // 禁用点击 - option.style.pointerEvents = 'none'; - }); - } - - // 标记正确答案 - markCorrectAnswer() { - const options = document.querySelectorAll('.option'); - const correctAnswer = this.currentQuestion.answer; - - options.forEach(option => { - const optionValue = option.dataset.value; - - if (optionValue === correctAnswer) { - option.classList.add('correct'); - } - - // 禁用点击 - option.style.pointerEvents = 'none'; - }); - } - - // 格式化解析内容 - formatExplanation(explanation) { - // 转义HTML - let formatted = this.escapeHtml(explanation); - - // 处理代码块 - formatted = formatted.replace(/```js\n([\s\S]*?)\n```/g, '
    $1
    '); - formatted = formatted.replace(/```javascript\n([\s\S]*?)\n```/g, '
    $1
    '); - formatted = formatted.replace(/```([\s\S]*?)```/g, '
    $1
    '); - - // 处理行内代码 - formatted = formatted.replace(/`([^`]+)`/g, '$1'); - - // 处理换行 - formatted = formatted.replace(/\n\n/g, '

    '); - formatted = formatted.replace(/\n/g, '
    '); - - // 包装段落 - if (!formatted.includes('

    ')) { - formatted = '

    ' + formatted + '

    '; - } - - return formatted; - } - - // HTML转义 - escapeHtml(text) { - const div = document.createElement('div'); - div.textContent = text; - return div.innerHTML; - } - - // 导出为Markdown - exportToMarkdown() { - if (!this.currentQuestion) { - alert('请先加载题目后再导出!'); - return; - } - - const question = this.currentQuestion; - const timestamp = new Date().toLocaleString('zh-CN'); - - // 构建Markdown内容 - let markdown = `# JavaScript趣味题 #${question.id}\n\n`; - markdown += `> 导出时间: ${timestamp}\n\n`; - - // 题目部分 - markdown += `## 题目\n\n`; - markdown += `${question.question}\n\n`; - - // 代码部分 - markdown += `## 代码\n\n`; - markdown += `\`\`\`javascript\n${question.code}\n\`\`\`\n\n`; - - // 选项部分 - markdown += `## 选项\n\n`; - question.options.forEach((option, index) => { - const letter = String.fromCharCode(65 + index); // A, B, C, D - const isCorrect = letter === question.answer; - markdown += `${letter}. ${option}${isCorrect ? ' ✅' : ''}\n`; - }); - markdown += `\n`; - - // 答案部分 - markdown += `## 正确答案\n\n`; - markdown += `**${question.answer}**\n\n`; - - // 解析部分 - markdown += `## 答案解析\n\n`; - // 清理解析内容中的HTML标签,转换为Markdown格式 - let explanation = question.explanation; - explanation = explanation.replace(//gi, '\n'); - explanation = explanation.replace(/

    /gi, '\n'); - explanation = explanation.replace(/<\/p>/gi, '\n'); - explanation = explanation.replace(/]*>/gi, '`'); - explanation = explanation.replace(/<\/code>/gi, '`'); - explanation = explanation.replace(/

    /gi, '\n```javascript\n');
    -        explanation = explanation.replace(/<\/code><\/pre>/gi, '\n```\n');
    -        explanation = explanation.replace(/<[^>]*>/g, ''); // 移除其他HTML标签
    -        explanation = explanation.replace(/\n\s*\n/g, '\n\n'); // 清理多余空行
    -        markdown += explanation.trim() + '\n\n';
    -        
    -        // 添加页脚
    -        markdown += `---\n\n`;
    -        markdown += `*本题目来源于JavaScript趣味题集合*\n`;
    -        markdown += `*导出工具: JavaScript趣味题网页版*\n`;
    -        
    -        // 创建下载
    -        this.downloadMarkdown(markdown, `JavaScript趣味题_${question.id}_${new Date().getTime()}.md`);
    -    }
    -    
    -    // 下载Markdown文件
    -    downloadMarkdown(content, filename) {
    -        const blob = new Blob([content], { type: 'text/markdown;charset=utf-8' });
    -        const url = URL.createObjectURL(blob);
    -        
    -        const link = document.createElement('a');
    -        link.href = url;
    -        link.download = filename;
    -        link.style.display = 'none';
    -        
    -        document.body.appendChild(link);
    -        link.click();
    -        document.body.removeChild(link);
    -        
    -        // 清理URL对象
    -        setTimeout(() => {
    -            URL.revokeObjectURL(url);
    -        }, 100);
    -        
    -        // 显示成功提示
    -        this.showExportSuccess(filename);
    -    }
    -    
    -    // 显示导出成功提示
    -    showExportSuccess(filename) {
    -        // 创建临时提示元素
    -        const toast = document.createElement('div');
    -        toast.style.cssText = `
    -            position: fixed;
    -            top: 20px;
    -            right: 20px;
    -            background: linear-gradient(135deg, #4caf50, #45a049);
    -            color: white;
    -            padding: 15px 20px;
    -            border-radius: 8px;
    -            box-shadow: 0 4px 12px rgba(76, 175, 80, 0.3);
    -            z-index: 10000;
    -            font-size: 14px;
    -            max-width: 300px;
    -            word-wrap: break-word;
    -            animation: slideInRight 0.3s ease-out;
    -        `;
    -        
    -        toast.innerHTML = `
    -            
    - - - -
    -
    导出成功!
    -
    ${filename}
    -
    -
    - `; - - // 添加动画样式 - const style = document.createElement('style'); - style.textContent = ` - @keyframes slideInRight { - from { - transform: translateX(100%); - opacity: 0; - } - to { - transform: translateX(0); - opacity: 1; - } - } - @keyframes slideOutRight { - from { - transform: translateX(0); - opacity: 1; - } - to { - transform: translateX(100%); - opacity: 0; - } - } - `; - document.head.appendChild(style); - - document.body.appendChild(toast); - - // 3秒后自动消失 - setTimeout(() => { - toast.style.animation = 'slideOutRight 0.3s ease-in'; - setTimeout(() => { - if (toast.parentNode) { - document.body.removeChild(toast); - } - if (style.parentNode) { - document.head.removeChild(style); - } - }, 300); - }, 3000); - } -} - -// 页面加载完成后初始化应用 -document.addEventListener('DOMContentLoaded', () => { - new JSQuizApp(); -}); - -// 添加键盘快捷键支持 -document.addEventListener('keydown', (e) => { - // 按R键刷新题目 - if (e.key.toLowerCase() === 'r' && !e.ctrlKey && !e.metaKey) { - const refreshBtn = document.getElementById('refreshBtn'); - if (refreshBtn && !document.querySelector('.loading').style.display !== 'none') { - refreshBtn.click(); - } - } - - // 按数字键1-4选择选项 - if (['1', '2', '3', '4'].includes(e.key)) { - const options = document.querySelectorAll('.option'); - const index = parseInt(e.key) - 1; - if (options[index] && !options[index].style.pointerEvents) { - options[index].click(); - } - } - - // 按Enter键提交答案 - if (e.key === 'Enter') { - const submitBtn = document.getElementById('submitBtn'); - if (submitBtn && !submitBtn.disabled) { - submitBtn.click(); - } - } -}); - -// 添加触摸设备支持 -if ('ontouchstart' in window) { - document.addEventListener('touchstart', () => {}, { passive: true }); -} - -// 添加网络状态监听 -if ('navigator' in window && 'onLine' in navigator) { - window.addEventListener('online', () => { - console.log('网络连接已恢复'); - }); - - window.addEventListener('offline', () => { - console.log('网络连接已断开'); - }); -} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/娱乐消遣/随机JavaScript趣味题/接口集合.json b/frontend/react-app/public/60sapi/娱乐消遣/随机JavaScript趣味题/接口集合.json deleted file mode 100644 index 04e92b7f..00000000 --- a/frontend/react-app/public/60sapi/娱乐消遣/随机JavaScript趣味题/接口集合.json +++ /dev/null @@ -1,7 +0,0 @@ -[ - "https://60s-cf.viki.moe", - "https://60s.viki.moe", - "https://60s.b23.run", - "https://60s.114128.xyz", - "https://60s-cf.114128.xyz" -] diff --git a/frontend/react-app/public/60sapi/娱乐消遣/随机JavaScript趣味题/返回接口.json b/frontend/react-app/public/60sapi/娱乐消遣/随机JavaScript趣味题/返回接口.json deleted file mode 100644 index d6592cc8..00000000 --- a/frontend/react-app/public/60sapi/娱乐消遣/随机JavaScript趣味题/返回接口.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": { - "id": 11, - "question": "输出是什么?", - "code": "function Person(firstName, lastName) {\n this.firstName = firstName;\n this.lastName = lastName;\n}\n\nconst member = new Person(\"Lydia\", \"Hallie\");\nPerson.getFullName = function () {\n return `${this.firstName} ${this.lastName}`;\n}\n\nconsole.log(member.getFullName());", - "options": [ - "A: `TypeError`", - "B: `SyntaxError`", - "C: `Lydia Hallie`", - "D: `undefined` `undefined`" - ], - "answer": "A", - "explanation": "你不能像常规对象那样,给构造函数添加属性。如果你想一次性给所有实例添加特性,你应该使用原型。因此本例中,使用如下方式:\n\n```js\nPerson.prototype.getFullName = function () {\n return `${this.firstName} ${this.lastName}`;\n}\n```\n\n这才会使 `member.getFullName()` 起作用。为什么这么做有益的?假设我们将这个方法添加到构造函数本身里。也许不是每个 `Person` 实例都需要这个方法。这将浪费大量内存空间,因为它们仍然具有该属性,这将占用每个实例的内存空间。相反,如果我们只将它添加到原型中,那么它只存在于内存中的一个位置,但是所有实例都可以访问它!" - } -} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/娱乐消遣/随机KFC文案/css/background.css b/frontend/react-app/public/60sapi/娱乐消遣/随机KFC文案/css/background.css deleted file mode 100644 index 84d3b43d..00000000 --- a/frontend/react-app/public/60sapi/娱乐消遣/随机KFC文案/css/background.css +++ /dev/null @@ -1,81 +0,0 @@ -/* 背景样式文件 */ -body { - background: linear-gradient(135deg, #a8e6cf 0%, #dcedc1 25%, #ffd3a5 50%, #a8e6cf 75%, #88d8a3 100%); - background-size: 400% 400%; - animation: gradientShift 15s ease infinite; - position: relative; -} - -/* 背景动画 */ -@keyframes gradientShift { - 0% { - background-position: 0% 50%; - } - 50% { - background-position: 100% 50%; - } - 100% { - background-position: 0% 50%; - } -} - -/* 背景装饰元素 */ -body::before { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - radial-gradient(circle at 20% 80%, rgba(39, 174, 96, 0.1) 0%, transparent 50%), - radial-gradient(circle at 80% 20%, rgba(46, 204, 113, 0.1) 0%, transparent 50%), - radial-gradient(circle at 40% 40%, rgba(26, 188, 156, 0.05) 0%, transparent 50%); - pointer-events: none; - z-index: -1; -} - -/* 浮动装饰圆点 */ -body::after { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - radial-gradient(2px 2px at 20px 30px, rgba(39, 174, 96, 0.3), transparent), - radial-gradient(2px 2px at 40px 70px, rgba(46, 204, 113, 0.2), transparent), - radial-gradient(1px 1px at 90px 40px, rgba(26, 188, 156, 0.3), transparent), - radial-gradient(1px 1px at 130px 80px, rgba(39, 174, 96, 0.2), transparent), - radial-gradient(2px 2px at 160px 30px, rgba(46, 204, 113, 0.3), transparent); - background-repeat: repeat; - background-size: 200px 100px; - animation: floatDots 20s linear infinite; - pointer-events: none; - z-index: -1; -} - -@keyframes floatDots { - 0% { - transform: translateY(0px); - } - 100% { - transform: translateY(-100px); - } -} - -/* 响应式背景调整 */ -@media (max-width: 768px) { - body::after { - background-size: 150px 75px; - animation-duration: 25s; - } -} - -@media (max-width: 480px) { - body::after { - background-size: 100px 50px; - animation-duration: 30s; - } -} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/娱乐消遣/随机KFC文案/css/style.css b/frontend/react-app/public/60sapi/娱乐消遣/随机KFC文案/css/style.css deleted file mode 100644 index b1bef2cc..00000000 --- a/frontend/react-app/public/60sapi/娱乐消遣/随机KFC文案/css/style.css +++ /dev/null @@ -1,339 +0,0 @@ -/* 基础样式重置 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: 'Microsoft YaHei', 'PingFang SC', 'Helvetica Neue', Arial, sans-serif; - line-height: 1.6; - color: #2c3e50; - min-height: 100vh; - overflow-x: hidden; -} - -/* 容器布局 */ -.container { - min-height: 100vh; - display: flex; - flex-direction: column; - max-width: 1200px; - margin: 0 auto; - padding: 20px; -} - -/* 头部样式 */ -.header { - text-align: center; - margin-bottom: 40px; - padding: 30px 0; -} - -.title { - font-size: 2.5rem; - font-weight: 700; - color: #27ae60; - margin-bottom: 10px; - text-shadow: 0 2px 4px rgba(39, 174, 96, 0.2); -} - -.subtitle { - font-size: 1.1rem; - color: #7f8c8d; - font-weight: 400; -} - -/* 主要内容区域 */ -.main { - flex: 1; - display: flex; - justify-content: center; - align-items: center; -} - -.content-card { - background: rgba(255, 255, 255, 0.95); - border-radius: 20px; - padding: 40px; - box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1); - backdrop-filter: blur(10px); - border: 1px solid rgba(39, 174, 96, 0.1); - width: 100%; - max-width: 600px; - transition: transform 0.3s ease, box-shadow 0.3s ease; -} - -.content-card:hover { - transform: translateY(-5px); - box-shadow: 0 15px 40px rgba(0, 0, 0, 0.15); -} - -/* KFC文案内容 */ -.kfc-content { - min-height: 200px; - padding: 30px; - background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%); - border-radius: 15px; - border-left: 5px solid #27ae60; - margin-bottom: 30px; - position: relative; - overflow: hidden; -} - -.kfc-content::before { - content: '"'; - position: absolute; - top: 10px; - left: 15px; - font-size: 3rem; - color: #27ae60; - opacity: 0.3; - font-family: serif; -} - -.kfc-content p { - font-size: 1.1rem; - line-height: 1.8; - color: #2c3e50; - margin-left: 20px; - position: relative; - z-index: 1; -} - -.loading-text { - text-align: center; - color: #7f8c8d; - font-style: italic; -} - -/* 按钮组 */ -.button-group { - display: flex; - gap: 15px; - justify-content: center; - margin-bottom: 20px; -} - -.generate-btn, .copy-btn { - padding: 15px 30px; - border: none; - border-radius: 50px; - font-size: 1rem; - font-weight: 600; - cursor: pointer; - transition: all 0.3s ease; - position: relative; - overflow: hidden; -} - -.generate-btn { - background: linear-gradient(135deg, #27ae60 0%, #2ecc71 100%); - color: white; - box-shadow: 0 4px 15px rgba(39, 174, 96, 0.3); -} - -.generate-btn:hover { - transform: translateY(-2px); - box-shadow: 0 6px 20px rgba(39, 174, 96, 0.4); -} - -.generate-btn:active { - transform: translateY(0); -} - -.generate-btn:disabled { - opacity: 0.7; - cursor: not-allowed; - transform: none; -} - -.copy-btn { - background: linear-gradient(135deg, #3498db 0%, #5dade2 100%); - color: white; - box-shadow: 0 4px 15px rgba(52, 152, 219, 0.3); -} - -.copy-btn:hover { - transform: translateY(-2px); - box-shadow: 0 6px 20px rgba(52, 152, 219, 0.4); -} - -/* 编号信息 */ -.index-info { - text-align: center; - padding: 10px; - background: rgba(39, 174, 96, 0.1); - border-radius: 10px; - border: 1px solid rgba(39, 174, 96, 0.2); -} - -.index-text { - color: #27ae60; - font-weight: 600; - font-size: 0.9rem; -} - -#indexNumber { - color: #2c3e50; - font-weight: 700; -} - -/* 底部 */ -.footer { - text-align: center; - padding: 20px 0; - color: #7f8c8d; - font-size: 0.9rem; - margin-top: 40px; -} - -/* 提示框 */ -.toast { - position: fixed; - top: 20px; - right: 20px; - background: #27ae60; - color: white; - padding: 15px 25px; - border-radius: 10px; - box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2); - transform: translateX(400px); - transition: transform 0.3s ease; - z-index: 1000; - font-weight: 600; -} - -.toast.show { - transform: translateX(0); -} - -/* 平板端适配 (768px - 1024px) */ -@media (max-width: 1024px) and (min-width: 768px) { - .container { - padding: 15px; - } - - .title { - font-size: 2.2rem; - } - - .content-card { - padding: 35px; - max-width: 550px; - } - - .kfc-content { - padding: 25px; - min-height: 180px; - } - - .button-group { - flex-direction: row; - gap: 12px; - } - - .generate-btn, .copy-btn { - padding: 12px 25px; - font-size: 0.95rem; - } -} - -/* 手机端适配 (最大768px) */ -@media (max-width: 768px) { - .container { - padding: 10px; - } - - .header { - margin-bottom: 30px; - padding: 20px 0; - } - - .title { - font-size: 1.8rem; - margin-bottom: 8px; - } - - .subtitle { - font-size: 1rem; - } - - .content-card { - padding: 25px; - margin: 0 5px; - border-radius: 15px; - } - - .kfc-content { - padding: 20px; - min-height: 150px; - margin-bottom: 25px; - } - - .kfc-content::before { - font-size: 2.5rem; - top: 5px; - left: 10px; - } - - .kfc-content p { - font-size: 1rem; - line-height: 1.7; - margin-left: 15px; - } - - .button-group { - flex-direction: column; - gap: 10px; - } - - .generate-btn, .copy-btn { - padding: 12px 20px; - font-size: 0.9rem; - width: 100%; - } - - .footer { - font-size: 0.8rem; - margin-top: 30px; - } - - .toast { - right: 10px; - left: 10px; - transform: translateY(-100px); - font-size: 0.9rem; - } - - .toast.show { - transform: translateY(0); - } -} - -/* 小屏手机适配 (最大480px) */ -@media (max-width: 480px) { - .title { - font-size: 1.6rem; - } - - .content-card { - padding: 20px; - margin: 0; - } - - .kfc-content { - padding: 15px; - min-height: 120px; - } - - .kfc-content p { - font-size: 0.95rem; - margin-left: 10px; - } - - .generate-btn, .copy-btn { - padding: 10px 15px; - font-size: 0.85rem; - } -} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/娱乐消遣/随机KFC文案/index.html b/frontend/react-app/public/60sapi/娱乐消遣/随机KFC文案/index.html deleted file mode 100644 index 72ab0627..00000000 --- a/frontend/react-app/public/60sapi/娱乐消遣/随机KFC文案/index.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - 随机KFC文案生成器 - - - - -
    -
    -

    🍗 随机KFC文案生成器

    -

    疯狂星期四,文案来一套!

    -
    - -
    -
    -
    -

    点击按钮获取随机KFC文案...

    -
    - -
    - - -
    - - -
    -
    - -
    -

    © 2024 KFC文案生成器 | 让每个星期四都疯狂起来

    -
    -
    - -
    - - - - \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/娱乐消遣/随机KFC文案/js/main.js b/frontend/react-app/public/60sapi/娱乐消遣/随机KFC文案/js/main.js deleted file mode 100644 index 526c4750..00000000 --- a/frontend/react-app/public/60sapi/娱乐消遣/随机KFC文案/js/main.js +++ /dev/null @@ -1,240 +0,0 @@ -// KFC文案生成器主要功能 -class KFCGenerator { - constructor() { - this.apiEndpoints = []; - this.currentApiIndex = 0; - this.isLoading = false; - - this.init(); - } - - // 初始化 - async init() { - await this.loadApiEndpoints(); - this.bindEvents(); - } - - // 加载API接口列表 - async loadApiEndpoints() { - try { - const response = await fetch('./接口集合.json'); - this.apiEndpoints = await response.json(); - } catch (error) { - console.error('加载API接口列表失败:', error); - this.showToast('加载接口配置失败', 'error'); - } - } - - // 绑定事件 - bindEvents() { - const generateBtn = document.getElementById('generateBtn'); - const copyBtn = document.getElementById('copyBtn'); - - generateBtn.addEventListener('click', () => this.generateKFC()); - copyBtn.addEventListener('click', () => this.copyContent()); - } - - // 生成KFC文案 - async generateKFC() { - if (this.isLoading) return; - - this.setLoadingState(true); - - let success = false; - let attempts = 0; - const maxAttempts = this.apiEndpoints.length; - - while (!success && attempts < maxAttempts) { - try { - const apiUrl = this.apiEndpoints[this.currentApiIndex]; - const data = await this.fetchKFCData(apiUrl); - - if (data && data.code === 200 && data.data && data.data.kfc) { - this.displayKFC(data.data); - success = true; - } else { - throw new Error('API返回数据格式错误'); - } - } catch (error) { - console.error(`API ${this.currentApiIndex + 1} 请求失败:`, error); - this.currentApiIndex = (this.currentApiIndex + 1) % this.apiEndpoints.length; - attempts++; - } - } - - if (!success) { - this.showError('所有API接口都无法访问,请稍后重试'); - } - - this.setLoadingState(false); - } - - // 请求KFC数据 - async fetchKFCData(apiUrl) { - const controller = new AbortController(); - const timeoutId = setTimeout(() => controller.abort(), 10000); // 10秒超时 - - try { - const response = await fetch(`${apiUrl}/v2/kfc`, { - method: 'GET', - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - }, - signal: controller.signal - }); - - clearTimeout(timeoutId); - - if (!response.ok) { - throw new Error(`HTTP ${response.status}: ${response.statusText}`); - } - - return await response.json(); - } catch (error) { - clearTimeout(timeoutId); - throw error; - } - } - - // 显示KFC文案 - displayKFC(data) { - const contentElement = document.getElementById('kfcContent'); - const indexElement = document.getElementById('indexNumber'); - const indexInfo = document.getElementById('indexInfo'); - const copyBtn = document.getElementById('copyBtn'); - - // 显示文案内容 - contentElement.innerHTML = `

    ${this.escapeHtml(data.kfc)}

    `; - - // 显示编号信息 - if (data.index) { - indexElement.textContent = data.index; - indexInfo.style.display = 'block'; - } else { - indexInfo.style.display = 'none'; - } - - // 显示复制按钮 - copyBtn.style.display = 'inline-block'; - - // 添加显示动画 - contentElement.style.opacity = '0'; - contentElement.style.transform = 'translateY(20px)'; - - setTimeout(() => { - contentElement.style.transition = 'all 0.5s ease'; - contentElement.style.opacity = '1'; - contentElement.style.transform = 'translateY(0)'; - }, 100); - } - - // 显示错误信息 - showError(message) { - const contentElement = document.getElementById('kfcContent'); - contentElement.innerHTML = `

    ${this.escapeHtml(message)}

    `; - - const copyBtn = document.getElementById('copyBtn'); - const indexInfo = document.getElementById('indexInfo'); - copyBtn.style.display = 'none'; - indexInfo.style.display = 'none'; - } - - // 复制文案内容 - async copyContent() { - const contentElement = document.getElementById('kfcContent'); - const textContent = contentElement.querySelector('p')?.textContent; - - if (!textContent || textContent.includes('点击按钮获取') || textContent.includes('失败')) { - this.showToast('没有可复制的内容', 'error'); - return; - } - - try { - if (navigator.clipboard && window.isSecureContext) { - await navigator.clipboard.writeText(textContent); - } else { - // 降级方案 - const textArea = document.createElement('textarea'); - textArea.value = textContent; - textArea.style.position = 'fixed'; - textArea.style.left = '-999999px'; - textArea.style.top = '-999999px'; - document.body.appendChild(textArea); - textArea.focus(); - textArea.select(); - document.execCommand('copy'); - textArea.remove(); - } - - this.showToast('文案已复制到剪贴板', 'success'); - } catch (error) { - console.error('复制失败:', error); - this.showToast('复制失败,请手动选择复制', 'error'); - } - } - - // 设置加载状态 - setLoadingState(loading) { - this.isLoading = loading; - const generateBtn = document.getElementById('generateBtn'); - const btnText = generateBtn.querySelector('.btn-text'); - const btnLoading = generateBtn.querySelector('.btn-loading'); - - if (loading) { - generateBtn.disabled = true; - btnText.style.display = 'none'; - btnLoading.style.display = 'inline'; - } else { - generateBtn.disabled = false; - btnText.style.display = 'inline'; - btnLoading.style.display = 'none'; - } - } - - // 显示提示消息 - showToast(message, type = 'success') { - const toast = document.getElementById('toast'); - toast.textContent = message; - toast.className = `toast ${type}`; - toast.classList.add('show'); - - setTimeout(() => { - toast.classList.remove('show'); - }, 3000); - } - - // HTML转义 - escapeHtml(text) { - const div = document.createElement('div'); - div.textContent = text; - return div.innerHTML; - } -} - -// 页面加载完成后初始化 -document.addEventListener('DOMContentLoaded', () => { - const generator = new KFCGenerator(); - // 页面加载完成后自动生成一条文案 - setTimeout(() => { - generator.generateKFC(); - }, 1000); -}); - -// 添加键盘快捷键支持 -document.addEventListener('keydown', (event) => { - // 按空格键生成文案 - if (event.code === 'Space' && event.target.tagName !== 'INPUT' && event.target.tagName !== 'TEXTAREA') { - event.preventDefault(); - document.getElementById('generateBtn').click(); - } - - // Ctrl+C 复制文案 - if (event.ctrlKey && event.key === 'c' && event.target.tagName !== 'INPUT' && event.target.tagName !== 'TEXTAREA') { - const copyBtn = document.getElementById('copyBtn'); - if (copyBtn.style.display !== 'none') { - event.preventDefault(); - copyBtn.click(); - } - } -}); \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/娱乐消遣/随机KFC文案/接口集合.json b/frontend/react-app/public/60sapi/娱乐消遣/随机KFC文案/接口集合.json deleted file mode 100644 index 04e92b7f..00000000 --- a/frontend/react-app/public/60sapi/娱乐消遣/随机KFC文案/接口集合.json +++ /dev/null @@ -1,7 +0,0 @@ -[ - "https://60s-cf.viki.moe", - "https://60s.viki.moe", - "https://60s.b23.run", - "https://60s.114128.xyz", - "https://60s-cf.114128.xyz" -] diff --git a/frontend/react-app/public/60sapi/娱乐消遣/随机KFC文案/返回接口.json b/frontend/react-app/public/60sapi/娱乐消遣/随机KFC文案/返回接口.json deleted file mode 100644 index 0f729ba8..00000000 --- a/frontend/react-app/public/60sapi/娱乐消遣/随机KFC文案/返回接口.json +++ /dev/null @@ -1 +0,0 @@ -{"code":200,"message":"获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841","data":{"index":369,"kfc":"我不想你带着情绪过夜,这样会把你推的越来越远,我不想你离开我,我希望你可以多爱我一点,我不想因为一点点小问题就让我们两之间的感情产生隔阂。对我来说,双向奔赴的感情相处才有意义,看不到希望的事情我没办法坚持太久,我不想浪费时间在一些无意义无结果的事情上,时间应该用来做我该做的事情。很多人走不到最后,是因为理解不同步,但我跟你在一起,我知道你什样的人,我了解你甚至比了解自己还多,我和你在一起,不是因为其他,而是因为今天肯德基疯狂星期四,我希望你能请我吃!"}} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/娱乐消遣/随机一言/css/background.css b/frontend/react-app/public/60sapi/娱乐消遣/随机一言/css/background.css deleted file mode 100644 index 3a10cfda..00000000 --- a/frontend/react-app/public/60sapi/娱乐消遣/随机一言/css/background.css +++ /dev/null @@ -1,167 +0,0 @@ -/* 背景样式文件 - 金色光辉主题 */ - -/* 主背景 */ -body { - background: linear-gradient( - 135deg, - #fff8dc 0%, - #ffeaa7 25%, - #fdcb6e 50%, - #e17055 75%, - #d63031 100% - ); - background-size: 400% 400%; - animation: gradientShift 15s ease infinite; - position: relative; -} - -/* 背景装饰层 */ -body::before { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: - radial-gradient(circle at 20% 80%, rgba(255, 215, 0, 0.1) 0%, transparent 50%), - radial-gradient(circle at 80% 20%, rgba(255, 223, 0, 0.1) 0%, transparent 50%), - radial-gradient(circle at 40% 40%, rgba(212, 175, 55, 0.05) 0%, transparent 50%); - pointer-events: none; - z-index: 1; -} - -/* 动态光点效果 */ -body::after { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - radial-gradient(2px 2px at 20px 30px, rgba(255, 215, 0, 0.3), transparent), - radial-gradient(2px 2px at 40px 70px, rgba(255, 223, 0, 0.2), transparent), - radial-gradient(1px 1px at 90px 40px, rgba(212, 175, 55, 0.4), transparent), - radial-gradient(1px 1px at 130px 80px, rgba(255, 215, 0, 0.2), transparent), - radial-gradient(2px 2px at 160px 30px, rgba(255, 223, 0, 0.3), transparent); - background-repeat: repeat; - background-size: 200px 100px; - animation: sparkle 20s linear infinite; - pointer-events: none; - z-index: 2; -} - -/* 背景动画 */ -@keyframes gradientShift { - 0% { - background-position: 0% 50%; - } - 50% { - background-position: 100% 50%; - } - 100% { - background-position: 0% 50%; - } -} - -@keyframes sparkle { - 0% { - transform: translateY(0); - opacity: 1; - } - 100% { - transform: translateY(-100vh); - opacity: 0; - } -} - -/* 响应式背景调整 */ - -/* 平板端背景 */ -@media (min-width: 768px) and (max-width: 1024px) { - body::after { - background-size: 250px 120px; - } -} - -/* 电脑端背景 */ -@media (min-width: 1024px) { - body { - background-size: 300% 300%; - } - - body::after { - background-size: 300px 150px; - animation-duration: 25s; - } -} - -/* 手机端背景优化 */ -@media (max-width: 767px) { - body { - background-size: 200% 200%; - animation-duration: 10s; - } - - body::before { - background: - radial-gradient(circle at 30% 70%, rgba(255, 215, 0, 0.08) 0%, transparent 40%), - radial-gradient(circle at 70% 30%, rgba(255, 223, 0, 0.08) 0%, transparent 40%); - } - - body::after { - background-size: 150px 80px; - animation-duration: 15s; - } -} - -/* 超小屏幕背景 */ -@media (max-width: 479px) { - body { - background: linear-gradient( - 135deg, - #fff8dc 0%, - #ffeaa7 50%, - #fdcb6e 100% - ); - background-size: 150% 150%; - } - - body::after { - background-size: 120px 60px; - } -} - -/* 深色模式支持 */ -@media (prefers-color-scheme: dark) { - body { - background: linear-gradient( - 135deg, - #2c1810 0%, - #3d2914 25%, - #4a3319 50%, - #5c3e1f 75%, - #6b4423 100% - ); - } - - body::before { - background: - radial-gradient(circle at 20% 80%, rgba(255, 215, 0, 0.05) 0%, transparent 50%), - radial-gradient(circle at 80% 20%, rgba(255, 223, 0, 0.05) 0%, transparent 50%); - } -} - -/* 减少动画效果(用户偏好) */ -@media (prefers-reduced-motion: reduce) { - body, - body::before, - body::after { - animation: none; - } - - body { - background: linear-gradient(135deg, #fff8dc 0%, #ffeaa7 50%, #fdcb6e 100%); - } -} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/娱乐消遣/随机一言/css/style.css b/frontend/react-app/public/60sapi/娱乐消遣/随机一言/css/style.css deleted file mode 100644 index b84b1125..00000000 --- a/frontend/react-app/public/60sapi/娱乐消遣/随机一言/css/style.css +++ /dev/null @@ -1,357 +0,0 @@ -/* 基础样式重置 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: 'Microsoft YaHei', 'PingFang SC', 'Helvetica Neue', Arial, sans-serif; - line-height: 1.6; - color: #2c1810; - overflow-x: hidden; -} - -/* 容器布局 */ -.container { - min-height: 100vh; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - padding: 20px; - position: relative; -} - -/* 头部样式 */ -.header { - text-align: center; - margin-bottom: 40px; - z-index: 10; -} - -.title { - font-size: 3rem; - font-weight: 700; - color: #d4af37; - text-shadow: - 0 0 10px rgba(212, 175, 55, 0.8), - 0 0 20px rgba(212, 175, 55, 0.6), - 0 0 30px rgba(212, 175, 55, 0.4); - margin-bottom: 10px; - animation: titleGlow 3s ease-in-out infinite alternate; -} - -.subtitle { - font-size: 1.2rem; - color: #b8860b; - opacity: 0.9; - text-shadow: 0 0 5px rgba(184, 134, 11, 0.5); -} - -/* 主内容区域 */ -.main-content { - width: 100%; - max-width: 800px; - z-index: 10; -} - -/* 一言容器 */ -.quote-container { - background: linear-gradient(135deg, rgba(255, 215, 0, 0.1), rgba(255, 223, 0, 0.05)); - border: 2px solid rgba(212, 175, 55, 0.3); - border-radius: 20px; - padding: 40px; - margin-bottom: 30px; - backdrop-filter: blur(10px); - box-shadow: - 0 8px 32px rgba(212, 175, 55, 0.2), - inset 0 1px 0 rgba(255, 255, 255, 0.1); - position: relative; - overflow: hidden; -} - -.quote-container::before { - content: ''; - position: absolute; - top: -2px; - left: -2px; - right: -2px; - bottom: -2px; - background: linear-gradient(45deg, #ffd700, #ffed4e, #ffd700, #ffed4e); - border-radius: 22px; - z-index: -1; - animation: borderGlow 4s linear infinite; -} - -/* 加载状态 */ -.loading { - display: none; - text-align: center; - color: #d4af37; -} - -.loading.show { - display: block; -} - -.loading-spinner { - width: 40px; - height: 40px; - border: 4px solid rgba(212, 175, 55, 0.3); - border-top: 4px solid #d4af37; - border-radius: 50%; - margin: 0 auto 15px; - animation: spin 1s linear infinite; -} - -/* 一言显示 */ -.quote-display { - display: block; - text-align: center; -} - -.quote-display.hide { - display: none; -} - -.quote-text { - font-size: 1.8rem; - line-height: 1.8; - color: #2c1810; - margin-bottom: 20px; - text-shadow: 0 1px 2px rgba(212, 175, 55, 0.1); - font-weight: 500; -} - -.quote-index { - font-size: 0.9rem; - color: #b8860b; - opacity: 0.8; -} - -/* 错误信息 */ -.error-message { - display: none; - text-align: center; - color: #cd853f; -} - -.error-message.show { - display: block; -} - -.error-icon { - font-size: 2rem; - margin-bottom: 10px; -} - -.error-text { - font-size: 1.1rem; - line-height: 1.5; -} - -/* 控制按钮 */ -.controls { - text-align: center; -} - -.refresh-btn { - background: linear-gradient(135deg, #ffd700, #ffed4e); - border: none; - border-radius: 50px; - padding: 15px 30px; - font-size: 1.1rem; - font-weight: 600; - color: #2c1810; - cursor: pointer; - display: inline-flex; - align-items: center; - gap: 10px; - transition: all 0.3s ease; - box-shadow: - 0 4px 15px rgba(212, 175, 55, 0.3), - inset 0 1px 0 rgba(255, 255, 255, 0.3); - position: relative; - overflow: hidden; -} - -.refresh-btn:hover { - transform: translateY(-2px); - box-shadow: - 0 6px 20px rgba(212, 175, 55, 0.4), - inset 0 1px 0 rgba(255, 255, 255, 0.3); -} - -.refresh-btn:active { - transform: translateY(0); -} - -.refresh-btn:disabled { - opacity: 0.6; - cursor: not-allowed; - transform: none; -} - -.btn-icon { - font-size: 1.2rem; - transition: transform 0.3s ease; -} - -.refresh-btn:hover .btn-icon { - transform: rotate(180deg); -} - -/* 底部 */ -.footer { - margin-top: 40px; - text-align: center; - color: #b8860b; - opacity: 0.8; - font-size: 0.9rem; -} - -/* 动画效果 */ -@keyframes titleGlow { - 0% { - text-shadow: - 0 0 10px rgba(212, 175, 55, 0.8), - 0 0 20px rgba(212, 175, 55, 0.6), - 0 0 30px rgba(212, 175, 55, 0.4); - } - 100% { - text-shadow: - 0 0 15px rgba(212, 175, 55, 1), - 0 0 25px rgba(212, 175, 55, 0.8), - 0 0 35px rgba(212, 175, 55, 0.6); - } -} - -@keyframes borderGlow { - 0% { - background-position: 0% 50%; - } - 50% { - background-position: 100% 50%; - } - 100% { - background-position: 0% 50%; - } -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -/* 平板端适配 (768px - 1024px) */ -@media (min-width: 768px) and (max-width: 1024px) { - .container { - padding: 30px; - } - - .title { - font-size: 3.5rem; - } - - .subtitle { - font-size: 1.3rem; - } - - .quote-container { - padding: 50px; - } - - .quote-text { - font-size: 2rem; - } -} - -/* 电脑端适配 (1024px+) */ -@media (min-width: 1024px) { - .container { - padding: 40px; - } - - .title { - font-size: 4rem; - } - - .subtitle { - font-size: 1.4rem; - } - - .quote-container { - padding: 60px; - max-width: 900px; - } - - .quote-text { - font-size: 2.2rem; - line-height: 1.9; - } - - .refresh-btn { - padding: 18px 36px; - font-size: 1.2rem; - } -} - -/* 手机端适配 (小于768px) */ -@media (max-width: 767px) { - .container { - padding: 15px; - } - - .header { - margin-bottom: 30px; - } - - .title { - font-size: 2.5rem; - } - - .subtitle { - font-size: 1rem; - } - - .quote-container { - padding: 25px; - border-radius: 15px; - } - - .quote-text { - font-size: 1.4rem; - line-height: 1.6; - } - - .refresh-btn { - padding: 12px 24px; - font-size: 1rem; - } - - .footer { - margin-top: 30px; - font-size: 0.8rem; - } -} - -/* 超小屏幕适配 (小于480px) */ -@media (max-width: 479px) { - .title { - font-size: 2rem; - } - - .quote-container { - padding: 20px; - } - - .quote-text { - font-size: 1.2rem; - } - - .refresh-btn { - padding: 10px 20px; - font-size: 0.9rem; - } -} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/娱乐消遣/随机一言/index.html b/frontend/react-app/public/60sapi/娱乐消遣/随机一言/index.html deleted file mode 100644 index 4ef88f30..00000000 --- a/frontend/react-app/public/60sapi/娱乐消遣/随机一言/index.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - 随机一言 - 金色光辉 - - - - -
    -
    -

    随机一言

    -

    每一句话都是心灵的光芒

    -
    - -
    -
    -
    -
    -

    正在获取一言...

    -
    - -
    -
    - 点击下方按钮获取一言 -
    -
    -
    - -
    -
    ⚠️
    -
    -
    -
    - -
    - -
    -
    - -
    -

    愿每一句话都能温暖你的心

    -
    -
    - - - - \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/娱乐消遣/随机一言/js/script.js b/frontend/react-app/public/60sapi/娱乐消遣/随机一言/js/script.js deleted file mode 100644 index 5ce4546a..00000000 --- a/frontend/react-app/public/60sapi/娱乐消遣/随机一言/js/script.js +++ /dev/null @@ -1,225 +0,0 @@ -// 随机一言 JavaScript 功能实现 - -class HitokotoApp { - constructor() { - // API接口列表 - this.apiEndpoints = [ - "https://60s-cf.viki.moe", - "https://60s.viki.moe", - "https://60s.b23.run", - "https://60s.114128.xyz", - "https://60s-cf.114128.xyz" - ]; - - this.currentEndpointIndex = 0; - this.isLoading = false; - - // DOM 元素 - this.elements = { - loading: document.getElementById('loading'), - quoteDisplay: document.getElementById('quoteDisplay'), - quoteText: document.getElementById('quoteText'), - quoteIndex: document.getElementById('quoteIndex'), - errorMessage: document.getElementById('errorMessage'), - errorText: document.getElementById('errorText'), - refreshBtn: document.getElementById('refreshBtn') - }; - - this.init(); - } - - // 初始化应用 - init() { - this.bindEvents(); - this.hideAllStates(); - this.showQuoteDisplay(); - } - - // 绑定事件 - bindEvents() { - this.elements.refreshBtn.addEventListener('click', () => { - this.fetchHitokoto(); - }); - - // 键盘快捷键支持 - document.addEventListener('keydown', (e) => { - if (e.code === 'Space' && !this.isLoading) { - e.preventDefault(); - this.fetchHitokoto(); - } - }); - } - - // 隐藏所有状态 - hideAllStates() { - this.elements.loading.classList.remove('show'); - this.elements.quoteDisplay.classList.remove('hide'); - this.elements.errorMessage.classList.remove('show'); - } - - // 显示加载状态 - showLoading() { - this.hideAllStates(); - this.elements.loading.classList.add('show'); - this.elements.quoteDisplay.classList.add('hide'); - this.elements.refreshBtn.disabled = true; - this.isLoading = true; - } - - // 显示一言内容 - showQuoteDisplay() { - this.hideAllStates(); - this.elements.quoteDisplay.classList.remove('hide'); - this.elements.refreshBtn.disabled = false; - this.isLoading = false; - } - - // 显示错误信息 - showError(message) { - this.hideAllStates(); - this.elements.errorMessage.classList.add('show'); - this.elements.errorText.textContent = message; - this.elements.refreshBtn.disabled = false; - this.isLoading = false; - } - - // 获取一言数据 - async fetchHitokoto() { - if (this.isLoading) return; - - this.showLoading(); - - // 尝试所有API接口 - for (let i = 0; i < this.apiEndpoints.length; i++) { - const endpointIndex = (this.currentEndpointIndex + i) % this.apiEndpoints.length; - const endpoint = this.apiEndpoints[endpointIndex]; - - try { - const result = await this.tryFetchFromEndpoint(endpoint); - if (result.success) { - this.currentEndpointIndex = endpointIndex; - this.displayHitokoto(result.data); - return; - } - } catch (error) { - console.warn(`接口 ${endpoint} 请求失败:`, error.message); - continue; - } - } - - // 所有接口都失败 - this.showError('所有接口都无法访问,请检查网络连接或稍后重试'); - } - - // 尝试从指定接口获取数据 - async tryFetchFromEndpoint(endpoint) { - const controller = new AbortController(); - const timeoutId = setTimeout(() => controller.abort(), 10000); // 10秒超时 - - try { - const response = await fetch(`${endpoint}/v2/hitokoto?encoding=text`, { - method: 'GET', - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - }, - signal: controller.signal - }); - - clearTimeout(timeoutId); - - if (!response.ok) { - throw new Error(`HTTP ${response.status}: ${response.statusText}`); - } - - const data = await response.json(); - - // 验证返回数据格式 - if (data.code === 200 && data.data && data.data.hitokoto) { - return { - success: true, - data: data.data - }; - } else { - throw new Error('返回数据格式不正确'); - } - - } catch (error) { - clearTimeout(timeoutId); - - if (error.name === 'AbortError') { - throw new Error('请求超时'); - } - - throw error; - } - } - - // 显示一言内容 - displayHitokoto(data) { - // 更新一言文本 - this.elements.quoteText.textContent = data.hitokoto; - - // 更新序号信息 - if (data.index) { - this.elements.quoteIndex.textContent = `第 ${data.index} 条`; - } else { - this.elements.quoteIndex.textContent = ''; - } - - // 添加淡入动画效果 - this.elements.quoteText.style.opacity = '0'; - this.elements.quoteIndex.style.opacity = '0'; - - setTimeout(() => { - this.elements.quoteText.style.transition = 'opacity 0.5s ease'; - this.elements.quoteIndex.style.transition = 'opacity 0.5s ease'; - this.elements.quoteText.style.opacity = '1'; - this.elements.quoteIndex.style.opacity = '1'; - }, 100); - - this.showQuoteDisplay(); - - // 控制台输出调试信息 - console.log('一言获取成功:', { - content: data.hitokoto, - index: data.index, - endpoint: this.apiEndpoints[this.currentEndpointIndex] - }); - } - - // 获取随机接口(用于负载均衡) - getRandomEndpoint() { - const randomIndex = Math.floor(Math.random() * this.apiEndpoints.length); - return this.apiEndpoints[randomIndex]; - } -} - -// 页面加载完成后初始化应用 -document.addEventListener('DOMContentLoaded', () => { - const app = new HitokotoApp(); - - // 添加全局错误处理 - window.addEventListener('error', (event) => { - console.error('页面发生错误:', event.error); - }); - - window.addEventListener('unhandledrejection', (event) => { - console.error('未处理的Promise拒绝:', event.reason); - }); - - // 页面可见性变化时的处理 - document.addEventListener('visibilitychange', () => { - if (!document.hidden && !app.isLoading) { - // 页面重新可见时,可以选择刷新内容 - console.log('页面重新可见'); - } - }); - - console.log('随机一言应用初始化完成'); -}); - -// 导出应用类(如果需要在其他地方使用) -if (typeof module !== 'undefined' && module.exports) { - module.exports = HitokotoApp; -} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/娱乐消遣/随机一言/接口集合.json b/frontend/react-app/public/60sapi/娱乐消遣/随机一言/接口集合.json deleted file mode 100644 index 04e92b7f..00000000 --- a/frontend/react-app/public/60sapi/娱乐消遣/随机一言/接口集合.json +++ /dev/null @@ -1,7 +0,0 @@ -[ - "https://60s-cf.viki.moe", - "https://60s.viki.moe", - "https://60s.b23.run", - "https://60s.114128.xyz", - "https://60s-cf.114128.xyz" -] diff --git a/frontend/react-app/public/60sapi/娱乐消遣/随机一言/返回接口.json b/frontend/react-app/public/60sapi/娱乐消遣/随机一言/返回接口.json deleted file mode 100644 index 29342ebc..00000000 --- a/frontend/react-app/public/60sapi/娱乐消遣/随机一言/返回接口.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": { - "index": 2862, - "hitokoto": "你带上罪恶之冠,即使背负上所有罪恶和孤独,绝不让你受伤" - } -} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/娱乐消遣/随机唱歌音频/css/style.css b/frontend/react-app/public/60sapi/娱乐消遣/随机唱歌音频/css/style.css deleted file mode 100644 index c6b6f0d6..00000000 --- a/frontend/react-app/public/60sapi/娱乐消遣/随机唱歌音频/css/style.css +++ /dev/null @@ -1,251 +0,0 @@ -/* 随机唱歌音频 - 淡绿色清新风格样式 */ - -/* 重置样式 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; - background: linear-gradient(135deg, #a8e6cf 0%, #dcedc1 50%, #ffd3a5 100%); - min-height: 100vh; - color: #2d5016; - line-height: 1.6; - overflow-x: hidden; -} - -.container { - max-width: 900px; - margin: 0 auto; - padding: 20px; -} - -/* 头部 */ -.header { - text-align: center; - margin-bottom: 20px; - background: rgba(255, 255, 255, 0.85); - border-radius: 20px; - padding: 24px; - box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08); - backdrop-filter: blur(10px); -} - -.header h1 { - font-size: 2rem; - color: #2d5016; - margin-bottom: 10px; - font-weight: 700; - display: flex; - align-items: center; - justify-content: center; - gap: 12px; -} - -.header p { - color: #5a7c65; - font-size: 1rem; -} - -/* 用户卡片 */ -.user-card { - display: flex; - align-items: center; - justify-content: center; - gap: 15px; - background: rgba(255, 255, 255, 0.9); - padding: 16px; - border-radius: 15px; - box-shadow: 0 4px 18px rgba(45, 80, 22, 0.08); - margin-bottom: 15px; - text-align: center; -} - -.avatar { - width: 56px; - height: 56px; - border-radius: 50%; - object-fit: cover; - border: 3px solid rgba(129, 199, 132, 0.5); -} - -.user-info { - display: flex; - flex-direction: column; -} - -.nickname { - font-weight: 700; - font-size: 1.1rem; - color: #2d5016; -} - -.meta { - color: #5a7c65; - font-size: 0.9rem; -} - -/* 歌曲信息 */ -.song-card { - background: rgba(255, 255, 255, 0.9); - padding: 16px; - border-radius: 15px; - box-shadow: 0 4px 18px rgba(45, 80, 22, 0.08); - margin-bottom: 15px; - text-align: center; -} - -.song-title { - font-size: 1.2rem; - font-weight: 700; - margin-bottom: 8px; - color: #1b5e20; -} - -.song-meta { - color: #5a7c65; - font-size: 0.95rem; - margin-bottom: 10px; -} - -/* 歌词 */ -.lyrics { - background: rgba(129, 199, 132, 0.1); - border-radius: 12px; - padding: 12px; - max-height: 220px; - overflow: auto; -} - -.lyrics p { - margin-bottom: 6px; -} - -/* 音频播放器卡片 */ -.audio-card { - background: rgba(255, 255, 255, 0.9); - padding: 16px; - border-radius: 15px; - box-shadow: 0 4px 18px rgba(45, 80, 22, 0.08); - margin-bottom: 15px; -} - -.audio-actions { - display: flex; - flex-direction: column; - gap: 12px; - align-items: center; - margin-top: 10px; -} - -.btn { - background: linear-gradient(135deg, #81c784 0%, #66bb6a 100%); - color: white; - border: none; - padding: 10px 18px; - border-radius: 10px; - font-size: 0.95rem; - font-weight: 600; - cursor: pointer; - transition: all 0.25s ease; - box-shadow: 0 4px 12px rgba(129, 199, 132, 0.35); - text-decoration: none; -} - -.btn:hover { - transform: translateY(-2px); - box-shadow: 0 6px 18px rgba(129, 199, 132, 0.45); -} - -.info { - color: #5a7c65; - font-size: 0.9rem; -} - -/* 加载与错误 */ -.loading, .error { - text-align: center; - padding: 30px; - background: rgba(255, 255, 255, 0.85); - border-radius: 15px; - box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08); -} - -.spinner { - width: 36px; - height: 36px; - border: 4px solid #e8f5e8; - border-top: 4px solid #81c784; - border-radius: 50%; - animation: spin 1s linear infinite; - margin: 0 auto 18px; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -/* 动画 */ -.fade-in { - animation: fadeIn 0.5s ease-in-out; -} - -@keyframes fadeIn { - from { opacity: 0; transform: translateY(10px); } - to { opacity: 1; transform: translateY(0); } -} - -/* 平板端适配 */ -@media (max-width: 1024px) and (min-width: 768px) { - .container { padding: 16px; } - .header h1 { font-size: 1.8rem; } -} - -/* 手机端优先优化 */ -@media (max-width: 767px) { - .container { padding: 12px; } - .header { padding: 18px; } - .header h1 { font-size: 1.6rem; gap: 8px; } - - .user-card { - padding: 16px; - flex-direction: column; - text-align: center; - } - - .avatar { - width: 80px; - height: 80px; - margin-bottom: 8px; - } - - .song-card, .audio-card { - padding: 16px; - } - - .lyrics { - max-height: 180px; - text-align: left; - padding: 16px; - } - - .audio-actions { - flex-direction: column; - gap: 15px; - align-items: center; - } - - .info { - text-align: center; - line-height: 1.8; - } - - .btn { - width: 100%; - max-width: 200px; - text-align: center; - } -} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/娱乐消遣/随机唱歌音频/index.html b/frontend/react-app/public/60sapi/娱乐消遣/随机唱歌音频/index.html deleted file mode 100644 index 3134b76d..00000000 --- a/frontend/react-app/public/60sapi/娱乐消遣/随机唱歌音频/index.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - 随机唱歌音频 - 60s API 集合 - - - - - -
    -
    -

    - 🎵 随机唱歌音频 -

    -

    数据来自官方/权威源头,以确保稳定与实时 · 支持本地数据回退

    -
    - - -
    -
    -

    正在加载中,请稍候…

    -
    - - - - -
    - -
    - 用户头像 - -
    - - -
    -
    -
    -
    -
    -
    -
    - - -
    - -
    - -
    - ❤ 喜欢:- - · ⏱ 时长:--:-- - · 🗓 发布:- - · 🔗 查看原帖 -
    -
    -
    -
    -
    - - - - \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/娱乐消遣/随机唱歌音频/js/script.js b/frontend/react-app/public/60sapi/娱乐消遣/随机唱歌音频/js/script.js deleted file mode 100644 index 598eb5d6..00000000 --- a/frontend/react-app/public/60sapi/娱乐消遣/随机唱歌音频/js/script.js +++ /dev/null @@ -1,252 +0,0 @@ -// 随机唱歌音频 页面脚本 -(function () { - 'use strict'; - - const API = { - endpoints: [], - currentIndex: 0, - params: { - encoding: 'json' - }, - localFallback: '返回接口.json', - // 初始化API接口列表 - async init() { - try { - const res = await fetch('./接口集合.json'); - const endpoints = await res.json(); - this.endpoints = endpoints.map(endpoint => `${endpoint}/v2/changya`); - } catch (e) { - // 如果无法加载接口集合,使用默认接口 - this.endpoints = ['https://60s.viki.moe/v2/changya']; - } - }, - // 获取当前接口URL - getCurrentUrl() { - if (this.endpoints.length === 0) return null; - const url = new URL(this.endpoints[this.currentIndex]); - Object.entries(this.params).forEach(([k, v]) => url.searchParams.append(k, v)); - return url.toString(); - }, - // 切换到下一个接口 - switchToNext() { - this.currentIndex = (this.currentIndex + 1) % this.endpoints.length; - return this.currentIndex < this.endpoints.length; - }, - // 重置到第一个接口 - reset() { - this.currentIndex = 0; - } - }; - - // DOM 元素引用 - const els = { - loading: null, - error: null, - container: null, - avatar: null, - nickname: null, - gender: null, - songTitle: null, - songMeta: null, - lyrics: null, - audio: null, - likeCount: null, - publishTime: null, - link: null, - refreshBtn: null, - }; - - function initDom() { - els.loading = document.getElementById('loading'); - els.error = document.getElementById('error'); - els.container = document.getElementById('content'); - - els.avatar = document.getElementById('avatar'); - els.nickname = document.getElementById('nickname'); - els.gender = document.getElementById('gender'); - els.songTitle = document.getElementById('song-title'); - els.songMeta = document.getElementById('song-meta'); - els.lyrics = document.getElementById('lyrics'); - - els.audio = document.getElementById('audio'); - els.likeCount = document.getElementById('like-count'); - els.publishTime = document.getElementById('publish-time'); - els.link = document.getElementById('link'); - els.refreshBtn = document.getElementById('refresh-btn'); - } - - function showLoading() { - els.loading.style.display = 'block'; - els.error.style.display = 'none'; - els.container.style.display = 'none'; - } - - function showError(msg) { - els.loading.style.display = 'none'; - els.error.style.display = 'block'; - els.container.style.display = 'none'; - els.error.querySelector('p').textContent = msg || '获取数据失败,请稍后重试'; - } - - function showContent() { - els.loading.style.display = 'none'; - els.error.style.display = 'none'; - els.container.style.display = 'block'; - } - - function formatDuration(ms) { - if (!ms && ms !== 0) return ''; - const totalSeconds = Math.floor(ms / 1000); - const m = Math.floor(totalSeconds / 60).toString().padStart(2, '0'); - const s = (totalSeconds % 60).toString().padStart(2, '0'); - return `${m}:${s}`; - } - - function safeText(text) { - const div = document.createElement('div'); - div.textContent = text == null ? '' : String(text); - return div.innerHTML; - } - - async function fetchFromAPI() { - // 初始化API接口列表 - await API.init(); - - // 重置API索引到第一个接口 - API.reset(); - - // 尝试所有API接口 - for (let i = 0; i < API.endpoints.length; i++) { - try { - const url = API.getCurrentUrl(); - console.log(`尝试接口 ${i + 1}/${API.endpoints.length}: ${url}`); - - const resp = await fetch(url, { - cache: 'no-store', - timeout: 10000 // 10秒超时 - }); - - if (!resp.ok) { - throw new Error(`HTTP ${resp.status}: ${resp.statusText}`); - } - - const data = await resp.json(); - - if (data && data.code === 200) { - console.log(`接口 ${i + 1} 请求成功`); - return data; - } - - throw new Error(data && data.message ? data.message : '接口返回异常'); - - } catch (e) { - console.warn(`接口 ${i + 1} 失败:`, e.message); - - // 如果不是最后一个接口,切换到下一个 - if (i < API.endpoints.length - 1) { - API.switchToNext(); - continue; - } - - // 所有接口都失败了 - console.warn('所有远程接口都失败,尝试本地数据'); - return null; - } - } - } - - async function fetchFromLocal() { - try { - const resp = await fetch(API.localFallback + `?t=${Date.now()}`); - if (!resp.ok) throw new Error(`本地文件HTTP ${resp.status}`); - const data = await resp.json(); - return data; - } catch (e) { - console.error('读取本地返回接口.json失败:', e); - return null; - } - } - - function render(data) { - const d = data?.data || {}; - const user = d.user || {}; - const song = d.song || {}; - const audio = d.audio || {}; - - // 用户信息 - els.avatar.src = user.avatar_url || ''; - els.avatar.alt = (user.nickname || '用户') + ' 头像'; - els.nickname.textContent = user.nickname || '未知用户'; - els.gender.textContent = user.gender === 'female' ? '女' : user.gender === 'male' ? '男' : '未知'; - - // 歌曲信息 - els.songTitle.textContent = song.name || '未知歌曲'; - els.songMeta.textContent = song.singer ? `演唱:${song.singer}` : ''; - - els.lyrics.innerHTML = ''; - if (Array.isArray(song.lyrics)) { - const frag = document.createDocumentFragment(); - song.lyrics.forEach(line => { - const p = document.createElement('p'); - p.innerHTML = safeText(line); - frag.appendChild(p); - }); - els.lyrics.appendChild(frag); - } - - // 音频 - els.audio.src = audio.url || ''; - els.audio.preload = 'none'; - - // 其他信息 - els.likeCount.textContent = typeof audio.like_count === 'number' ? audio.like_count : '-'; - const publish = audio.publish || (audio.publish_at ? new Date(audio.publish_at).toLocaleString() : ''); - els.publishTime.textContent = publish; - els.link.href = audio.link || '#'; - els.link.target = '_blank'; - - // 时长信息 - const durationEl = document.getElementById('duration'); - durationEl.textContent = formatDuration(audio.duration); - - showContent(); - } - - async function load() { - showLoading(); - try { - // 先尝试远程API - const data = await fetchFromAPI(); - if (data) { - render(data); - return; - } - - // 远程API失败,尝试本地数据 - const localData = await fetchFromLocal(); - if (localData) { - render(localData); - return; - } - - // 都失败了 - showError('获取数据失败,请稍后重试'); - } catch (e) { - console.error('加载数据时发生错误:', e); - showError('获取数据失败,请稍后重试'); - } - } - - function bindEvents() { - if (els.refreshBtn) { - els.refreshBtn.addEventListener('click', load); - } - // 快捷键 Ctrl+R 刷新(不拦截浏览器默认刷新) - } - - document.addEventListener('DOMContentLoaded', () => { - initDom(); - bindEvents(); - load(); - }); -})(); \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/娱乐消遣/随机唱歌音频/接口集合.json b/frontend/react-app/public/60sapi/娱乐消遣/随机唱歌音频/接口集合.json deleted file mode 100644 index 04e92b7f..00000000 --- a/frontend/react-app/public/60sapi/娱乐消遣/随机唱歌音频/接口集合.json +++ /dev/null @@ -1,7 +0,0 @@ -[ - "https://60s-cf.viki.moe", - "https://60s.viki.moe", - "https://60s.b23.run", - "https://60s.114128.xyz", - "https://60s-cf.114128.xyz" -] diff --git a/frontend/react-app/public/60sapi/娱乐消遣/随机唱歌音频/返回接口.json b/frontend/react-app/public/60sapi/娱乐消遣/随机唱歌音频/返回接口.json deleted file mode 100644 index d364f524..00000000 --- a/frontend/react-app/public/60sapi/娱乐消遣/随机唱歌音频/返回接口.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": { - "user": { - "nickname": "𝑮𝑺_迷鹿_", - "gender": "female", - "avatar_url": "http://img-cdn.api.singduck.cn/user-img/6afbebcfae6144478c150d0c1d0d5899.jpg" - }, - "song": { - "name": "恶作剧", - "singer": "王蓝茵", - "lyrics": [ - "我想我会开始想念你", - "可是我刚刚才遇见了你", - "我怀疑这奇遇只是个恶作剧", - "我想我已慢慢喜欢你", - "因为我拥有爱情的勇气", - "我任性投入你给的恶作剧", - "你给的恶作剧" - ] - }, - "audio": { - "url": "http://audio-cdn.api.singduck.cn/ugc/220929_965696173_b822a290c553.wav?auth_key=1755845643-0-0-4029539b73e17337dcac49cc4e0ecfcc", - "duration": 35050, - "like_count": 955, - "link": "https://m.api.singduck.cn/user-piece/toGZlBfZbukck2sHb", - "publish": "2022/09/29 18:33:51", - "publish_at": 1664447631000 - } - } -} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/实用功能/EpicGames免费游戏/css/style.css b/frontend/react-app/public/60sapi/实用功能/EpicGames免费游戏/css/style.css deleted file mode 100644 index 30d4f120..00000000 --- a/frontend/react-app/public/60sapi/实用功能/EpicGames免费游戏/css/style.css +++ /dev/null @@ -1,330 +0,0 @@ -/* Epic Games 免费游戏 - 淡绿色清新风格样式 */ - -/* 重置样式 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; - background: linear-gradient(135deg, #a8e6cf 0%, #dcedc1 50%, #ffd3a5 100%); - min-height: 100vh; - color: #2d5016; - line-height: 1.6; - overflow-x: hidden; -} - -.container { - max-width: 1200px; - margin: 0 auto; - padding: 20px; -} - -/* 头部 */ -.header { - text-align: center; - margin-bottom: 30px; - background: rgba(255, 255, 255, 0.85); - border-radius: 20px; - padding: 24px; - box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08); - backdrop-filter: blur(10px); -} - -.header h1 { - font-size: 2.2rem; - color: #2d5016; - margin-bottom: 10px; - font-weight: 700; - display: flex; - align-items: center; - justify-content: center; - gap: 12px; -} - -.header p { - color: #5a7c65; - font-size: 1rem; -} - -/* 统计信息 */ -.stats { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); - gap: 15px; - margin-bottom: 25px; -} - -.stat-card { - background: rgba(255, 255, 255, 0.9); - padding: 16px; - border-radius: 15px; - text-align: center; - box-shadow: 0 4px 18px rgba(45, 80, 22, 0.08); -} - -.stat-number { - font-size: 1.8rem; - font-weight: 700; - color: #1b5e20; - margin-bottom: 5px; -} - -.stat-label { - color: #5a7c65; - font-size: 0.9rem; -} - -/* 游戏网格 */ -.games-grid { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); - gap: 20px; - margin-bottom: 20px; -} - -/* 游戏卡片 */ -.game-card { - background: rgba(255, 255, 255, 0.95); - border-radius: 18px; - overflow: hidden; - box-shadow: 0 6px 25px rgba(45, 80, 22, 0.1); - transition: all 0.3s ease; - position: relative; -} - -.game-card:hover { - transform: translateY(-5px); - box-shadow: 0 12px 35px rgba(45, 80, 22, 0.15); -} - -.game-cover { - width: 100%; - height: 180px; - object-fit: cover; - border-radius: 0; -} - -.game-info { - padding: 18px; -} - -.game-title { - font-size: 1.1rem; - font-weight: 700; - color: #1b5e20; - margin-bottom: 8px; - line-height: 1.3; - display: -webkit-box; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; - overflow: hidden; -} - -.game-description { - color: #5a7c65; - font-size: 0.9rem; - margin-bottom: 12px; - display: -webkit-box; - -webkit-line-clamp: 3; - -webkit-box-orient: vertical; - overflow: hidden; - line-height: 1.4; -} - -.game-meta { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 12px; -} - -.game-price { - font-size: 1rem; - font-weight: 600; -} - -.original-price { - color: #81c784; - text-decoration: line-through; -} - -.free-price { - color: #2e7d32; - font-weight: 700; -} - -.game-seller { - color: #5a7c65; - font-size: 0.85rem; -} - -.game-dates { - background: rgba(129, 199, 132, 0.1); - padding: 10px; - border-radius: 10px; - margin-bottom: 12px; - font-size: 0.85rem; - color: #2d5016; -} - -.free-period { - display: flex; - justify-content: space-between; - margin-bottom: 4px; -} - -.game-actions { - display: flex; - gap: 10px; -} - -.btn { - flex: 1; - background: linear-gradient(135deg, #81c784 0%, #66bb6a 100%); - color: white; - border: none; - padding: 10px 16px; - border-radius: 10px; - font-size: 0.9rem; - font-weight: 600; - cursor: pointer; - transition: all 0.25s ease; - box-shadow: 0 4px 12px rgba(129, 199, 132, 0.35); - text-decoration: none; - text-align: center; - display: inline-block; -} - -.btn:hover { - transform: translateY(-2px); - box-shadow: 0 6px 18px rgba(129, 199, 132, 0.45); -} - -.btn-secondary { - background: linear-gradient(135deg, #a5d6a7 0%, #81c784 100%); -} - -/* 状态标签 */ -.status-badge { - position: absolute; - top: 12px; - right: 12px; - padding: 6px 12px; - border-radius: 20px; - font-size: 0.8rem; - font-weight: 600; - color: white; - text-shadow: 0 1px 2px rgba(0,0,0,0.2); -} - -.status-free { - background: linear-gradient(135deg, #4caf50 0%, #2e7d32 100%); -} - -.status-upcoming { - background: linear-gradient(135deg, #ff9800 0%, #f57c00 100%); -} - -/* 加载与错误 */ -.loading, .error { - text-align: center; - padding: 40px; - background: rgba(255, 255, 255, 0.85); - border-radius: 15px; - box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08); -} - -.spinner { - width: 40px; - height: 40px; - border: 4px solid #e8f5e8; - border-top: 4px solid #81c784; - border-radius: 50%; - animation: spin 1s linear infinite; - margin: 0 auto 20px; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -/* 动画 */ -.fade-in { - animation: fadeIn 0.6s ease-in-out; -} - -@keyframes fadeIn { - from { opacity: 0; transform: translateY(20px); } - to { opacity: 1; transform: translateY(0); } -} - -/* 平板端适配 */ -@media (max-width: 1024px) and (min-width: 768px) { - .container { padding: 16px; } - .header h1 { font-size: 2rem; } - .games-grid { grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); } -} - -/* 手机端优化 */ -@media (max-width: 767px) { - .container { padding: 12px; } - .header { padding: 18px; } - .header h1 { font-size: 1.8rem; gap: 8px; } - - .stats { - display: flex; - flex-direction: row; - justify-content: space-between; - gap: 8px; - } - - .stat-card { - padding: 10px 8px; - flex: 1; - min-width: 0; - } - .stat-number { font-size: 1.4rem; } - .stat-label { font-size: 0.75rem; } - - .games-grid { - grid-template-columns: 1fr; - gap: 16px; - } - - .game-card { margin: 0 4px; } - .game-cover { height: 160px; } - .game-info { padding: 14px; } - - .game-actions { - flex-direction: column; - } - - .btn { - width: 100%; - padding: 12px; - } -} - -/* 小屏手机优化 */ -@media (max-width: 480px) { - .stats { - grid-template-columns: 1fr; - } - - .game-meta { - flex-direction: column; - align-items: flex-start; - gap: 6px; - } -} - -/* 高分辨率显示器优化 */ -@media (min-width: 1400px) { - .games-grid { - grid-template-columns: repeat(auto-fill, minmax(350px, 1fr)); - } -} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/实用功能/EpicGames免费游戏/index.html b/frontend/react-app/public/60sapi/实用功能/EpicGames免费游戏/index.html deleted file mode 100644 index c29c106f..00000000 --- a/frontend/react-app/public/60sapi/实用功能/EpicGames免费游戏/index.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - Epic Games 免费游戏 - 60s API 集合 - - - - - -
    -
    -

    - 🎮 Epic Games 免费游戏 -

    -
    - - -
    -
    -

    正在加载游戏数据,请稍候…

    -
    - - - - -
    - -
    -
    -
    0
    -
    总游戏数
    -
    -
    -
    0
    -
    当前免费
    -
    -
    -
    0
    -
    即将免费
    -
    -
    - - -
    - -
    - - -
    - -
    -
    -
    - - - - \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/实用功能/EpicGames免费游戏/js/script.js b/frontend/react-app/public/60sapi/实用功能/EpicGames免费游戏/js/script.js deleted file mode 100644 index c9592876..00000000 --- a/frontend/react-app/public/60sapi/实用功能/EpicGames免费游戏/js/script.js +++ /dev/null @@ -1,266 +0,0 @@ -// Epic Games 免费游戏 页面脚本 -(function () { - 'use strict'; - - const API = { - endpoints: [], - currentIndex: 0, - // 初始化API接口列表 - async init() { - try { - const res = await fetch('./接口集合.json'); - const endpoints = await res.json(); - this.endpoints = endpoints.map(endpoint => `${endpoint}/v2/epic`); - } catch (e) { - // 如果无法加载接口集合,使用默认接口 - this.endpoints = ['https://60s-api.viki.moe/v2/epic']; - } - }, - // 获取当前接口URL - getCurrentUrl(encoding) { - if (this.endpoints.length === 0) return null; - const url = new URL(this.endpoints[this.currentIndex]); - if (encoding) url.searchParams.set('encoding', encoding); - return url.toString(); - }, - // 切换到下一个接口 - switchToNext() { - this.currentIndex = (this.currentIndex + 1) % this.endpoints.length; - return this.currentIndex < this.endpoints.length; - }, - // 重置到第一个接口 - reset() { - this.currentIndex = 0; - } - }; - - // DOM 元素引用 - const els = { - loading: null, - error: null, - container: null, - gamesGrid: null, - totalGames: null, - freeNow: null, - upcoming: null, - refreshBtn: null, - }; - - function initDom() { - els.loading = document.getElementById('loading'); - els.error = document.getElementById('error'); - els.container = document.getElementById('content'); - els.gamesGrid = document.getElementById('games-grid'); - els.totalGames = document.getElementById('total-games'); - els.freeNow = document.getElementById('free-now'); - els.upcoming = document.getElementById('upcoming'); - els.refreshBtn = document.getElementById('refresh-btn'); - } - - function showLoading() { - els.loading.style.display = 'block'; - els.error.style.display = 'none'; - els.container.style.display = 'none'; - } - - function showError(msg) { - els.loading.style.display = 'none'; - els.error.style.display = 'block'; - els.container.style.display = 'none'; - els.error.querySelector('p').textContent = msg || '获取数据失败,请稍后重试'; - } - - function showContent() { - els.loading.style.display = 'none'; - els.error.style.display = 'none'; - els.container.style.display = 'block'; - } - - function safeText(text) { - const div = document.createElement('div'); - div.textContent = text == null ? '' : String(text); - return div.innerHTML; - } - - function formatDate(dateStr) { - if (!dateStr) return ''; - try { - const date = new Date(dateStr); - return date.toLocaleDateString('zh-CN', { - month: '2-digit', - day: '2-digit', - hour: '2-digit', - minute: '2-digit' - }); - } catch (e) { - return dateStr; - } - } - - async function fetchData(preferLocal = false) { - if (preferLocal) { - try { - const res = await fetch('./返回接口.json', { cache: 'no-store' }); - const json = await res.json(); - return json; - } catch (e) { - throw new Error('本地数据加载失败'); - } - } - - // 重置API索引到第一个接口 - API.reset(); - - // 尝试所有API接口 - for (let i = 0; i < API.endpoints.length; i++) { - try { - const url = API.getCurrentUrl(); - console.log(`尝试接口 ${i + 1}/${API.endpoints.length}: ${url}`); - - const res = await fetch(url, { - cache: 'no-store', - timeout: 10000 // 10秒超时 - }); - - if (!res.ok) { - throw new Error(`HTTP ${res.status}: ${res.statusText}`); - } - - const json = await res.json(); - - if (json && json.code === 200) { - console.log(`接口 ${i + 1} 请求成功`); - return json; - } - - throw new Error(json && json.message ? json.message : '接口返回异常'); - - } catch (e) { - console.warn(`接口 ${i + 1} 失败:`, e.message); - - // 如果不是最后一个接口,切换到下一个 - if (i < API.endpoints.length - 1) { - API.switchToNext(); - continue; - } - - // 所有接口都失败了,尝试本地数据 - console.warn('所有远程接口都失败,尝试本地数据'); - try { - const res = await fetch('./返回接口.json', { cache: 'no-store' }); - const json = await res.json(); - return json; - } catch (e2) { - throw new Error('所有接口和本地数据都无法访问'); - } - } - } - } - - function createGameCard(game) { - const isFree = game.is_free_now; - const statusClass = isFree ? 'status-free' : 'status-upcoming'; - const statusText = isFree ? '限时免费' : '即将免费'; - - return ` -
    -
    ${statusText}
    - ${safeText(game.title)} 封面 -
    -

    ${safeText(game.title)}

    -

    ${safeText(game.description)}

    - -
    -
    - ${safeText(game.original_price_desc)} - 免费 -
    -
    ${safeText(game.seller)}
    -
    - -
    -
    - 开始:${formatDate(game.free_start)} - 结束:${formatDate(game.free_end)} -
    -
    - - -
    -
    - `; - } - - function updateStats(games) { - const total = games.length; - const freeNow = games.filter(game => game.is_free_now).length; - const upcoming = total - freeNow; - - els.totalGames.textContent = total; - els.freeNow.textContent = freeNow; - els.upcoming.textContent = upcoming; - } - - function renderGames(games) { - if (!Array.isArray(games) || games.length === 0) { - els.gamesGrid.innerHTML = '
    暂无游戏数据
    '; - return; - } - - // 按状态排序:免费的在前 - const sortedGames = [...games].sort((a, b) => { - if (a.is_free_now && !b.is_free_now) return -1; - if (!a.is_free_now && b.is_free_now) return 1; - return 0; - }); - - const html = sortedGames.map(game => createGameCard(game)).join(''); - els.gamesGrid.innerHTML = html; - - updateStats(games); - } - - function render(data) { - const games = data?.data || []; - renderGames(games); - showContent(); - } - - async function load() { - showLoading(); - - // 初始化API接口列表 - await API.init(); - - try { - const data = await fetchData(false); - render(data); - } catch (e) { - console.error('数据获取失败:', e); - showError(e.message || '获取数据失败,请稍后重试'); - } - } - - function bindEvents() { - if (els.refreshBtn) { - els.refreshBtn.addEventListener('click', load); - } - - // 快捷键 Ctrl+R 刷新(不拦截浏览器默认刷新) - document.addEventListener('keydown', (e) => { - if (e.ctrlKey && e.key === 'r' && !e.defaultPrevented) { - // 不阻止默认行为,让浏览器正常刷新 - } - }); - } - - document.addEventListener('DOMContentLoaded', () => { - initDom(); - bindEvents(); - load(); - }); -})(); \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/实用功能/EpicGames免费游戏/接口集合.json b/frontend/react-app/public/60sapi/实用功能/EpicGames免费游戏/接口集合.json deleted file mode 100644 index 04e92b7f..00000000 --- a/frontend/react-app/public/60sapi/实用功能/EpicGames免费游戏/接口集合.json +++ /dev/null @@ -1,7 +0,0 @@ -[ - "https://60s-cf.viki.moe", - "https://60s.viki.moe", - "https://60s.b23.run", - "https://60s.114128.xyz", - "https://60s-cf.114128.xyz" -] diff --git a/frontend/react-app/public/60sapi/实用功能/EpicGames免费游戏/返回接口.json b/frontend/react-app/public/60sapi/实用功能/EpicGames免费游戏/返回接口.json deleted file mode 100644 index 7804d62a..00000000 --- a/frontend/react-app/public/60sapi/实用功能/EpicGames免费游戏/返回接口.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": [ - { - "id": "9aa227e2ba294bb1a95c95fde892eb31", - "title": "《Totally Reliable Delivery Service》 Standard Edition", - "cover": "https://cdn1.epicgames.com/52b90f9a982a404781b189f6a7903226/offer/EGS_TotallyReliableDeliveryService_WereFiveGames_S1-2560x1440-47e6e9562d62705a75ea7b7096d0b8dc.jpg", - "original_price": 52, - "original_price_desc": "¥52.00", - "description": "穿好护腰护具,发动货车,送货的时间到啦!在一个高度互动的沙盒世界中,与最多三位好友一起随意地完成送货。货物已试投,这就是我们靠谱快递(Totally Reliable Delivery Service)的品质保证!", - "seller": "Infogrames LLC", - "is_free_now": true, - "free_start": "2025/08/14 23:00:00", - "free_start_at": 1755183600000, - "free_end": "2025/08/21 23:00:00", - "free_end_at": 1755788400000, - "link": "https://store.epicgames.com/store/zh-CN/p/totally-reliable-delivery-service/home" - }, - { - "id": "8ea3500dc38e4f429702bf889c172d3d", - "title": "Hidden Folks", - "cover": "https://cdn1.epicgames.com/spt-assets/7bfd56b0586348dcb139945d9e59f988/hidden-folks-1b7hh.png", - "original_price": 47, - "original_price_desc": "¥47.00", - "description": "Search for hidden folks in hand-drawn, interactive, miniature landscapes. Unfurl tent flaps, cut through bushes, slam doors, and poke some crocodiles! Rooooaaaarrrr!!!!!", - "seller": "Adriaan de Jongh", - "is_free_now": true, - "free_start": "2025/08/14 23:00:00", - "free_start_at": 1755183600000, - "free_end": "2025/08/21 23:00:00", - "free_end_at": 1755788400000, - "link": "https://store.epicgames.com/store/zh-CN/p/hidden-folks-239d16" - }, - { - "id": "4cbb6c3704d240f19c3dd5f5cb2b0cb4", - "title": "Kamaeru", - "cover": "https://cdn1.epicgames.com/spt-assets/44313cfbb62b4df5801d0c8d541c2624/kamaeru-40asc.png", - "original_price": 62, - "original_price_desc": "¥62.00", - "description": "Foster a sanctuary for frogs and restore the biodiversity of the wetlands in Kamaeru, a cozy frog collecting game, where you take pictures of frogs, play mini-games and decorate your habitat. Hop right to it!", - "seller": "Armor Games Studios", - "is_free_now": false, - "free_start": "2025/08/21 23:00:00", - "free_start_at": 1755788400000, - "free_end": "2025/08/28 23:00:00", - "free_end_at": 1756393200000, - "link": "https://store.epicgames.com/store/zh-CN/p/kamaeru-0c301e" - }, - { - "id": "0d9a533f0e684cc18620a8f408e8e72c", - "title": "Strange Horticulture", - "cover": "https://cdn1.epicgames.com/spt-assets/15e8e3eba65a4763a815d6eae1d763b2/strange-horticulture-offer-2wghv.png", - "original_price": 45, - "original_price_desc": "¥45.00", - "description": "款神秘学解谜游戏,你将扮演当地植物商店的店主,寻找并识别新的植物,悠闲撸猫,与女巫团体交谈,或加入异教。收集各种强大的植物,用它们来影响故事走向,揭开昂德米尔镇的黑暗谜团。", - "seller": "Iceberg Interactive", - "is_free_now": false, - "free_start": "2025/08/21 23:00:00", - "free_start_at": 1755788400000, - "free_end": "2025/08/28 23:00:00", - "free_end_at": 1756393200000, - "link": "https://store.epicgames.com/store/zh-CN/p/strange-horticulture-360e80" - } - ] -} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/实用功能/农历信息/css/background.css b/frontend/react-app/public/60sapi/实用功能/农历信息/css/background.css deleted file mode 100644 index 254496c1..00000000 --- a/frontend/react-app/public/60sapi/实用功能/农历信息/css/background.css +++ /dev/null @@ -1,89 +0,0 @@ -/* 玻璃拟态背景相关样式 */ -body { - background: linear-gradient(135deg, - #667eea 0%, - #764ba2 25%, - #f093fb 50%, - #f5576c 75%, - #4facfe 100% - ); - background-size: 400% 400%; - animation: gradientShift 20s ease infinite; - background-attachment: fixed; - min-height: 100vh; - position: relative; -} - -@keyframes gradientShift { - 0% { background-position: 0% 50%; } - 25% { background-position: 100% 50%; } - 50% { background-position: 100% 100%; } - 75% { background-position: 0% 100%; } - 100% { background-position: 0% 50%; } -} - -/* 玻璃拟态装饰层 */ -body::before { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: - radial-gradient(circle at 20% 20%, rgba(255, 255, 255, 0.1) 0%, transparent 40%), - radial-gradient(circle at 80% 80%, rgba(255, 255, 255, 0.08) 0%, transparent 40%), - radial-gradient(circle at 40% 60%, rgba(255, 255, 255, 0.06) 0%, transparent 30%), - radial-gradient(circle at 60% 30%, rgba(255, 255, 255, 0.05) 0%, transparent 35%); - pointer-events: none; - z-index: -1; - animation: glassFloat 25s ease-in-out infinite alternate; -} - -/* 毛玻璃气泡效果 */ -body::after { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - radial-gradient(circle at 10% 20%, rgba(255, 255, 255, 0.3) 2px, transparent 2px), - radial-gradient(circle at 30% 40%, rgba(255, 255, 255, 0.25) 3px, transparent 3px), - radial-gradient(circle at 50% 60%, rgba(255, 255, 255, 0.2) 1.5px, transparent 1.5px), - radial-gradient(circle at 70% 80%, rgba(255, 255, 255, 0.3) 2.5px, transparent 2.5px), - radial-gradient(circle at 90% 10%, rgba(255, 255, 255, 0.25) 2px, transparent 2px), - radial-gradient(circle at 20% 90%, rgba(255, 255, 255, 0.2) 1px, transparent 1px); - background-size: 300px 300px, 250px 250px, 400px 400px, 200px 200px, 350px 350px, 150px 150px; - animation: bubbleFloat 30s linear infinite; - pointer-events: none; - z-index: -1; - opacity: 0.7; -} - -@keyframes glassFloat { - 0% { - transform: translateY(0px) rotate(0deg); - opacity: 0.7; - } - 100% { - transform: translateY(-20px) rotate(2deg); - opacity: 0.9; - } -} - -@keyframes bubbleFloat { - 0%, 100% { - transform: translateX(0) translateY(0); - } - 25% { - transform: translateX(-15px) translateY(-10px); - } - 50% { - transform: translateX(10px) translateY(-20px); - } - 75% { - transform: translateX(-5px) translateY(-15px); - } -} diff --git a/frontend/react-app/public/60sapi/实用功能/农历信息/css/style.css b/frontend/react-app/public/60sapi/实用功能/农历信息/css/style.css deleted file mode 100644 index 1c679c5f..00000000 --- a/frontend/react-app/public/60sapi/实用功能/农历信息/css/style.css +++ /dev/null @@ -1,1105 +0,0 @@ -/* 重置样式 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Helvetica Neue', Arial, sans-serif; - line-height: 1.6; - color: #2c3e50; - overflow-x: hidden; -} - -/* 容器 */ -.container { - max-width: 1200px; - margin: 0 auto; - padding: 20px; - animation: containerFadeIn 1s ease-out; -} - -@keyframes containerFadeIn { - from { - opacity: 0; - transform: translateY(30px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -/* 玻璃拟态基础样式 */ -.glass-morphism { - background: rgba(255, 255, 255, 0.15); - backdrop-filter: blur(20px); - -webkit-backdrop-filter: blur(20px); - border: 1px solid rgba(255, 255, 255, 0.2); - box-shadow: - 0 8px 32px 0 rgba(31, 38, 135, 0.15), - inset 0 1px 0 rgba(255, 255, 255, 0.3); - border-radius: 20px; -} - -/* 头部 */ -.header { - text-align: center; - margin-bottom: 40px; - background: rgba(255, 255, 255, 0.1); - backdrop-filter: blur(25px); - -webkit-backdrop-filter: blur(25px); - padding: 40px 30px; - border-radius: 25px; - border: 1px solid rgba(255, 255, 255, 0.2); - box-shadow: - 0 8px 32px 0 rgba(31, 38, 135, 0.2), - inset 0 1px 0 rgba(255, 255, 255, 0.4); - position: relative; - overflow: hidden; -} - -.header::before { - content: ''; - position: absolute; - top: 0; - left: -100%; - width: 100%; - height: 100%; - background: linear-gradient(90deg, - transparent, - rgba(255, 255, 255, 0.1), - transparent - ); - animation: headerShimmer 6s ease-in-out infinite; -} - -@keyframes headerShimmer { - 0% { left: -100%; } - 50% { left: 100%; } - 100% { left: 100%; } -} - -.header-icon { - font-size: 4em; - margin-bottom: 15px; - animation: iconFloat 3s ease-in-out infinite; - text-shadow: 0 0 20px rgba(255, 255, 255, 0.5); -} - -@keyframes iconFloat { - 0%, 100% { - transform: translateY(0) scale(1); - filter: drop-shadow(0 0 10px rgba(255, 255, 255, 0.3)); - } - 50% { - transform: translateY(-10px) scale(1.05); - filter: drop-shadow(0 5px 15px rgba(255, 255, 255, 0.5)); - } -} - -.title { - font-size: 3.2em; - font-weight: 800; - color: rgba(255, 255, 255, 0.95); - margin-bottom: 10px; - text-shadow: 0 2px 10px rgba(0, 0, 0, 0.3); - letter-spacing: 2px; - animation: titleGlow 4s ease-in-out infinite alternate; -} - -@keyframes titleGlow { - 0% { - text-shadow: 0 2px 10px rgba(0, 0, 0, 0.3); - color: rgba(255, 255, 255, 0.95); - } - 100% { - text-shadow: 0 0 20px rgba(255, 255, 255, 0.8), 0 2px 10px rgba(0, 0, 0, 0.3); - color: rgba(255, 255, 255, 1); - } -} - -.subtitle { - font-size: 1.3em; - color: rgba(255, 255, 255, 0.8); - margin-bottom: 30px; - font-weight: 500; - text-shadow: 0 1px 5px rgba(0, 0, 0, 0.2); -} - -/* 日期选择器 */ -.date-selector { - display: flex; - align-items: flex-end; - justify-content: center; - gap: 20px; - margin-bottom: 25px; - flex-wrap: wrap; -} - -.input-group { - display: flex; - flex-direction: column; - gap: 8px; - min-width: 200px; -} - -.input-label { - display: flex; - align-items: center; - gap: 8px; - color: rgba(255, 255, 255, 0.9); - font-weight: 600; - font-size: 1em; - text-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); -} - -.label-icon { - font-size: 1.2em; -} - -.date-input { - background: rgba(255, 255, 255, 0.1); - backdrop-filter: blur(10px); - -webkit-backdrop-filter: blur(10px); - border: 1px solid rgba(255, 255, 255, 0.3); - border-radius: 15px; - padding: 12px 16px; - color: rgba(255, 255, 255, 0.95); - font-size: 1em; - font-weight: 500; - transition: all 0.3s ease; - box-shadow: - 0 4px 15px rgba(31, 38, 135, 0.1), - inset 0 1px 0 rgba(255, 255, 255, 0.2); -} - -.date-input:focus { - outline: none; - border-color: rgba(255, 255, 255, 0.5); - background: rgba(255, 255, 255, 0.15); - box-shadow: - 0 6px 20px rgba(31, 38, 135, 0.2), - inset 0 1px 0 rgba(255, 255, 255, 0.3), - 0 0 0 3px rgba(255, 255, 255, 0.1); - transform: translateY(-2px); -} - -.date-input::-webkit-calendar-picker-indicator { - filter: invert(1); - opacity: 0.8; - cursor: pointer; -} - -.query-btn { - background: rgba(255, 255, 255, 0.15); - backdrop-filter: blur(15px); - -webkit-backdrop-filter: blur(15px); - color: rgba(255, 255, 255, 0.95); - border: 1px solid rgba(255, 255, 255, 0.3); - padding: 12px 28px; - border-radius: 20px; - cursor: pointer; - font-size: 1em; - font-weight: 600; - transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94); - display: flex; - align-items: center; - gap: 8px; - position: relative; - overflow: hidden; - text-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); - box-shadow: - 0 4px 15px rgba(31, 38, 135, 0.2), - inset 0 1px 0 rgba(255, 255, 255, 0.3); -} - -.query-btn::before { - content: ''; - position: absolute; - top: 0; - left: -100%; - width: 100%; - height: 100%; - background: linear-gradient(90deg, - transparent, - rgba(255, 255, 255, 0.2), - transparent - ); - transition: left 0.6s ease; -} - -.query-btn:hover::before { - left: 100%; -} - -.query-btn:hover { - background: rgba(255, 255, 255, 0.2); - border-color: rgba(255, 255, 255, 0.4); - transform: translateY(-3px); - box-shadow: - 0 8px 25px rgba(31, 38, 135, 0.3), - inset 0 1px 0 rgba(255, 255, 255, 0.4); -} - -.btn-icon { - font-size: 1.2em; - transition: transform 0.3s ease; -} - -.query-btn:hover .btn-icon { - transform: scale(1.1) rotate(5deg); -} - -.update-time { - display: flex; - align-items: center; - justify-content: center; - gap: 8px; - color: rgba(255, 255, 255, 0.8); - font-size: 1em; - padding: 10px 20px; - background: rgba(255, 255, 255, 0.08); - backdrop-filter: blur(8px); - -webkit-backdrop-filter: blur(8px); - border-radius: 20px; - border: 1px solid rgba(255, 255, 255, 0.15); - display: inline-flex; - text-shadow: 0 1px 3px rgba(0, 0, 0, 0.2); -} - -.time-icon { - font-size: 1.2em; - animation: clockTick 2s infinite; -} - -@keyframes clockTick { - 0%, 50% { transform: rotate(0deg); } - 25% { transform: rotate(15deg); } - 75% { transform: rotate(-15deg); } -} - -/* 玻璃拟态加载动画 */ -.loading { - text-align: center; - padding: 60px 40px; - background: rgba(255, 255, 255, 0.1); - backdrop-filter: blur(25px); - -webkit-backdrop-filter: blur(25px); - border-radius: 25px; - margin-bottom: 25px; - border: 1px solid rgba(255, 255, 255, 0.2); - box-shadow: - 0 8px 32px 0 rgba(31, 38, 135, 0.2), - inset 0 1px 0 rgba(255, 255, 255, 0.3); -} - -.loading-content { - display: flex; - flex-direction: column; - align-items: center; - gap: 25px; -} - -.glass-spinner { - width: 60px; - height: 60px; - border: 4px solid rgba(255, 255, 255, 0.1); - border-top: 4px solid rgba(255, 255, 255, 0.8); - border-radius: 50%; - animation: glassSpinnerRotate 1.5s linear infinite; - position: relative; - backdrop-filter: blur(5px); - -webkit-backdrop-filter: blur(5px); -} - -.glass-spinner::before { - content: ''; - position: absolute; - top: -4px; - left: -4px; - right: -4px; - bottom: -4px; - border: 2px solid rgba(255, 255, 255, 0.05); - border-top: 2px solid rgba(255, 255, 255, 0.3); - border-radius: 50%; - animation: glassSpinnerRotate 2s linear infinite reverse; -} - -@keyframes glassSpinnerRotate { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -.loading-text { - display: flex; - flex-direction: column; - align-items: center; - gap: 15px; -} - -.loading-emoji { - font-size: 2.5em; - animation: mysticalPulse 2s ease-in-out infinite alternate; - filter: drop-shadow(0 0 10px rgba(255, 255, 255, 0.5)); -} - -@keyframes mysticalPulse { - 0% { - transform: scale(1); - filter: drop-shadow(0 0 10px rgba(255, 255, 255, 0.5)); - } - 100% { - transform: scale(1.1); - filter: drop-shadow(0 0 20px rgba(255, 255, 255, 0.8)); - } -} - -.loading-text p { - font-size: 1.2em; - color: rgba(255, 255, 255, 0.9); - font-weight: 600; - margin: 0; - text-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); -} - -.loading-dots { - display: flex; - gap: 8px; -} - -.loading-dots span { - width: 10px; - height: 10px; - background: rgba(255, 255, 255, 0.7); - border-radius: 50%; - animation: glassDotsFloat 1.4s ease-in-out infinite both; - backdrop-filter: blur(2px); - -webkit-backdrop-filter: blur(2px); - box-shadow: 0 2px 8px rgba(255, 255, 255, 0.3); -} - -.loading-dots span:nth-child(1) { animation-delay: -0.32s; } -.loading-dots span:nth-child(2) { animation-delay: -0.16s; } -.loading-dots span:nth-child(3) { animation-delay: 0s; } - -@keyframes glassDotsFloat { - 0%, 80%, 100% { - transform: scale(0.8); - opacity: 0.5; - } - 40% { - transform: scale(1.2); - opacity: 1; - } -} - -/* 农历信息展示 */ -.lunar-info { - display: grid; - gap: 25px; - animation: infoFadeIn 0.8s ease-out; -} - -@keyframes infoFadeIn { - from { - opacity: 0; - transform: translateY(30px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -.info-card { - background: rgba(255, 255, 255, 0.12); - backdrop-filter: blur(20px); - -webkit-backdrop-filter: blur(20px); - border: 1px solid rgba(255, 255, 255, 0.2); - border-radius: 20px; - padding: 30px; - position: relative; - overflow: hidden; - transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94); - box-shadow: - 0 8px 32px 0 rgba(31, 38, 135, 0.15), - inset 0 1px 0 rgba(255, 255, 255, 0.3); -} - -.info-card::before { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 3px; - background: linear-gradient(90deg, - rgba(255, 255, 255, 0.3), - rgba(255, 255, 255, 0.6), - rgba(255, 255, 255, 0.3) - ); - transform: scaleX(0); - transition: transform 0.4s ease; -} - -.info-card:hover::before { - transform: scaleX(1); -} - -.info-card:hover { - transform: translateY(-5px); - background: rgba(255, 255, 255, 0.15); - border-color: rgba(255, 255, 255, 0.3); - box-shadow: - 0 12px 40px 0 rgba(31, 38, 135, 0.2), - inset 0 1px 0 rgba(255, 255, 255, 0.4); -} - -.card-header { - display: flex; - align-items: center; - gap: 15px; - margin-bottom: 20px; -} - -.card-icon { - font-size: 2.5em; - animation: cardIconFloat 3s ease-in-out infinite; -} - -@keyframes cardIconFloat { - 0%, 100% { transform: translateY(0) rotate(0deg); } - 50% { transform: translateY(-5px) rotate(5deg); } -} - -.card-title { - font-size: 1.5em; - font-weight: 700; - color: rgba(255, 255, 255, 0.95); - text-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); -} - -.card-content { - display: grid; - gap: 15px; -} - -.info-item { - display: flex; - align-items: center; - gap: 12px; - padding: 15px; - background: rgba(255, 255, 255, 0.08); - backdrop-filter: blur(10px); - -webkit-backdrop-filter: blur(10px); - border-radius: 15px; - border: 1px solid rgba(255, 255, 255, 0.15); - transition: all 0.3s ease; -} - -.info-item:hover { - background: rgba(255, 255, 255, 0.12); - transform: scale(1.02); -} - -.item-icon { - font-size: 1.3em; - min-width: 30px; - text-align: center; -} - -.item-label { - font-weight: 600; - color: rgba(255, 255, 255, 0.9); - min-width: 80px; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); -} - -.item-value { - font-weight: 700; - color: rgba(255, 255, 255, 0.95); - font-size: 1.1em; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); -} - -/* 错误信息 */ -.error-message { - text-align: center; - padding: 60px 40px; - background: rgba(255, 255, 255, 0.1); - backdrop-filter: blur(25px); - -webkit-backdrop-filter: blur(25px); - border-radius: 25px; - border: 1px solid rgba(255, 255, 255, 0.2); - box-shadow: - 0 8px 32px 0 rgba(31, 38, 135, 0.2), - inset 0 1px 0 rgba(255, 255, 255, 0.3); -} - -.error-content { - display: flex; - flex-direction: column; - align-items: center; - gap: 25px; -} - -.error-icon { - font-size: 4em; - animation: errorFloat 2s ease-in-out infinite alternate; - filter: drop-shadow(0 0 10px rgba(255, 255, 255, 0.3)); -} - -@keyframes errorFloat { - 0% { transform: translateY(0) rotate(-5deg); } - 100% { transform: translateY(-10px) rotate(5deg); } -} - -.error-content h3 { - font-size: 1.6em; - color: rgba(255, 255, 255, 0.95); - margin: 0; - font-weight: 700; - text-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); -} - -.error-content p { - color: rgba(255, 255, 255, 0.8); - font-size: 1.1em; - margin: 0; - line-height: 1.6; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); -} - -.retry-btn { - background: rgba(255, 255, 255, 0.15); - backdrop-filter: blur(15px); - -webkit-backdrop-filter: blur(15px); - color: rgba(255, 255, 255, 0.95); - border: 1px solid rgba(255, 255, 255, 0.3); - padding: 12px 25px; - border-radius: 20px; - cursor: pointer; - font-size: 1em; - font-weight: 600; - transition: all 0.4s ease; - display: inline-flex; - align-items: center; - gap: 8px; - text-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); - box-shadow: - 0 4px 15px rgba(31, 38, 135, 0.2), - inset 0 1px 0 rgba(255, 255, 255, 0.3); -} - -.retry-btn:hover { - background: rgba(255, 255, 255, 0.2); - border-color: rgba(255, 255, 255, 0.4); - transform: translateY(-2px); - box-shadow: - 0 6px 20px rgba(31, 38, 135, 0.3), - inset 0 1px 0 rgba(255, 255, 255, 0.4); -} - -.retry-btn span { - font-size: 1.1em; - transition: transform 0.3s ease; -} - -.retry-btn:hover span { - transform: rotate(180deg); -} - -/* 功能提示 */ -.feature-tips { - margin-top: 40px; -} - -.tip-card { - background: rgba(255, 255, 255, 0.1); - backdrop-filter: blur(20px); - -webkit-backdrop-filter: blur(20px); - border: 1px solid rgba(255, 255, 255, 0.2); - border-radius: 20px; - padding: 30px; - text-align: center; - box-shadow: - 0 8px 32px 0 rgba(31, 38, 135, 0.15), - inset 0 1px 0 rgba(255, 255, 255, 0.3); -} - -.tip-icon { - font-size: 3em; - margin-bottom: 15px; - animation: tipBlink 3s ease-in-out infinite; -} - -@keyframes tipBlink { - 0%, 100% { opacity: 1; transform: scale(1); } - 50% { opacity: 0.7; transform: scale(1.05); } -} - -.tip-card h3 { - font-size: 1.4em; - font-weight: 700; - color: rgba(255, 255, 255, 0.95); - margin-bottom: 20px; - text-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); -} - -.tip-card ul { - list-style: none; - display: grid; - gap: 12px; - text-align: left; -} - -.tip-card li { - color: rgba(255, 255, 255, 0.9); - font-size: 1em; - padding: 10px 15px; - background: rgba(255, 255, 255, 0.08); - backdrop-filter: blur(5px); - -webkit-backdrop-filter: blur(5px); - border-radius: 10px; - border: 1px solid rgba(255, 255, 255, 0.15); - transition: all 0.3s ease; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); -} - -.tip-card li:hover { - background: rgba(255, 255, 255, 0.12); - transform: translateX(5px); -} - -/* 平板端适配 (768px - 1024px) */ -@media (min-width: 768px) and (max-width: 1024px) { - .container { - padding: 25px; - } - - .header { - padding: 35px 25px; - } - - .header-icon { - font-size: 3.5em; - } - - .title { - font-size: 2.8em; - letter-spacing: 1.5px; - } - - .subtitle { - font-size: 1.2em; - } - - .date-selector { - gap: 15px; - } - - .input-group { - min-width: 180px; - } - - .lunar-info { - grid-template-columns: repeat(auto-fit, minmax(400px, 1fr)); - gap: 20px; - } - - .info-card { - padding: 25px; - } -} - -/* 电脑端适配 (1025px+) */ -@media (min-width: 1025px) { - .container { - padding: 40px; - } - - .header { - padding: 50px 40px; - margin-bottom: 50px; - } - - .header-icon { - font-size: 4.5em; - } - - .title { - font-size: 3.8em; - letter-spacing: 3px; - } - - .subtitle { - font-size: 1.4em; - } - - .date-selector { - gap: 25px; - } - - .input-group { - min-width: 220px; - } - - .date-input { - padding: 14px 18px; - font-size: 1.05em; - } - - .query-btn { - padding: 14px 32px; - font-size: 1.05em; - } - - .lunar-info { - grid-template-columns: repeat(auto-fit, minmax(500px, 1fr)); - gap: 30px; - } - - .info-card { - padding: 35px; - } - - .card-title { - font-size: 1.6em; - } - - .item-label { - min-width: 100px; - } - - .item-value { - font-size: 1.15em; - } - - /* 电脑端特殊效果 */ - .info-card:hover { - transform: translateY(-8px) scale(1.02); - } -} - -/* 手机端适配 (767px以下) */ -@media (max-width: 767px) { - .container { - padding: 15px; - } - - .header { - padding: 25px 20px; - margin-bottom: 25px; - } - - .header-icon { - font-size: 2.8em; - } - - .title { - font-size: 2.2em; - letter-spacing: 1px; - } - - .subtitle { - font-size: 1em; - } - - .date-selector { - flex-direction: column; - gap: 15px; - align-items: center; - } - - .input-group { - width: 100%; - max-width: 300px; - min-width: auto; - } - - .date-input { - padding: 10px 14px; - font-size: 0.95em; - } - - .query-btn { - padding: 10px 24px; - font-size: 0.95em; - width: 100%; - max-width: 200px; - justify-content: center; - } - - .update-time { - font-size: 0.9em; - padding: 8px 16px; - } - - .info-card { - padding: 20px; - border-radius: 15px; - } - - .card-header { - gap: 12px; - margin-bottom: 15px; - } - - .card-icon { - font-size: 2em; - } - - .card-title { - font-size: 1.3em; - } - - .info-item { - padding: 12px; - flex-direction: column; - align-items: flex-start; - gap: 8px; - } - - .item-icon { - font-size: 1.2em; - } - - .item-label { - min-width: auto; - font-size: 0.9em; - } - - .item-value { - font-size: 1em; - } - - .tip-card { - padding: 20px; - } - - .tip-card ul { - gap: 10px; - } - - .tip-card li { - padding: 8px 12px; - font-size: 0.9em; - } -} - -/* 超小屏幕适配 (480px以下) */ -@media (max-width: 480px) { - .container { - padding: 12px; - } - - .header { - padding: 20px 15px; - margin-bottom: 20px; - } - - .header-icon { - font-size: 2.5em; - } - - .title { - font-size: 1.9em; - letter-spacing: 0.5px; - } - - .subtitle { - font-size: 0.95em; - } - - .date-selector { - gap: 12px; - } - - .input-group { - max-width: 280px; - } - - .date-input { - padding: 8px 12px; - font-size: 0.9em; - } - - .query-btn { - padding: 8px 20px; - font-size: 0.9em; - max-width: 180px; - } - - .update-time { - font-size: 0.85em; - padding: 6px 12px; - flex-direction: column; - gap: 4px; - } - - .lunar-info { - gap: 15px; - } - - .info-card { - padding: 18px 15px; - border-radius: 12px; - } - - .card-header { - gap: 10px; - margin-bottom: 12px; - } - - .card-icon { - font-size: 1.8em; - } - - .card-title { - font-size: 1.2em; - } - - .info-item { - padding: 10px; - gap: 6px; - } - - .item-icon { - font-size: 1.1em; - } - - .item-label { - font-size: 0.85em; - } - - .item-value { - font-size: 0.95em; - } - - .tip-card { - padding: 15px; - } - - .tip-icon { - font-size: 2.5em; - } - - .tip-card h3 { - font-size: 1.2em; - } - - .tip-card li { - padding: 6px 10px; - font-size: 0.85em; - } - - /* 超小屏幕性能优化 */ - .info-card { - transition: transform 0.2s ease, background 0.2s ease; - } - - .info-card::before { - display: none; - } - - .loading-content { - gap: 15px; - } - - .loading-emoji { - font-size: 2em; - } - - .error-icon { - font-size: 3em; - } -} - -/* 时辰宜忌特殊样式 */ -.hours-card { - grid-column: 1 / -1; /* 占满整行 */ -} - -.hours-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); - gap: 15px; - margin-top: 15px; -} - -.hour-item { - background: rgba(255, 255, 255, 0.1); - backdrop-filter: blur(10px); - border: 1px solid rgba(255, 255, 255, 0.2); - border-radius: 12px; - padding: 12px; - transition: all 0.3s ease; -} - -.hour-item:hover { - background: rgba(255, 255, 255, 0.15); - transform: translateY(-2px); - box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1); -} - -.hour-name { - font-size: 14px; - font-weight: 600; - color: #ffffff; - text-align: center; - margin-bottom: 8px; - padding: 4px 8px; - background: rgba(255, 255, 255, 0.1); - border-radius: 6px; -} - -.hour-content { - font-size: 12px; - line-height: 1.4; -} - -.hour-recommends, -.hour-avoids { - margin: 4px 0; -} - -.hour-label { - font-weight: 600; - color: #ffffff; - margin-right: 4px; -} - -.hour-recommends .hour-label { - color: #4ade80; -} - -.hour-avoids .hour-label { - color: #f87171; -} - -.hour-text { - color: rgba(255, 255, 255, 0.9); -} - -/* 时辰宜忌响应式优化 */ -@media (max-width: 768px) { - .hours-grid { - grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); - gap: 10px; - } - - .hour-item { - padding: 8px; - } - - .hour-name { - font-size: 12px; - margin-bottom: 6px; - } - - .hour-content { - font-size: 11px; - } -} diff --git a/frontend/react-app/public/60sapi/实用功能/农历信息/index.html b/frontend/react-app/public/60sapi/实用功能/农历信息/index.html deleted file mode 100644 index 0e8aace3..00000000 --- a/frontend/react-app/public/60sapi/实用功能/农历信息/index.html +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - 🌙 农历信息查询 - - - - -
    -
    -
    🏮
    -

    🌙 农历信息查询 📅

    -

    传统文化 · 时光转换 · 节气查询

    - -
    -
    - - -
    - -
    - -
    - - 等待查询... -
    -
    - - - - - - - - - - - diff --git a/frontend/react-app/public/60sapi/实用功能/农历信息/js/script.js b/frontend/react-app/public/60sapi/实用功能/农历信息/js/script.js deleted file mode 100644 index a2fb42cc..00000000 --- a/frontend/react-app/public/60sapi/实用功能/农历信息/js/script.js +++ /dev/null @@ -1,485 +0,0 @@ -// API接口列表 -const API_ENDPOINTS = [ - "https://60s-cf.viki.moe", - "https://60s.viki.moe", - "https://60s.b23.run", - "https://60s.114128.xyz", - "https://60s-cf.114128.xyz" -]; - -// 当前使用的API索引 -let currentApiIndex = 0; - -// DOM元素 -const loadingElement = document.getElementById('loading'); -const lunarInfoElement = document.getElementById('lunarInfo'); -const errorMessageElement = document.getElementById('errorMessage'); -const updateTimeElement = document.getElementById('updateTime'); -const dateInput = document.getElementById('dateInput'); -const queryBtn = document.getElementById('queryBtn'); - -// 页面加载完成后初始化 -document.addEventListener('DOMContentLoaded', function() { - initializePage(); -}); - -// 初始化页面 -function initializePage() { - // 设置默认日期为今天 - const today = new Date(); - const dateString = today.toISOString().split('T')[0]; - dateInput.value = dateString; - - // 绑定事件 - queryBtn.addEventListener('click', queryLunarInfo); - dateInput.addEventListener('change', queryLunarInfo); - - // 自动查询当天信息 - queryLunarInfo(); -} - -// 查询农历信息 -async function queryLunarInfo() { - const selectedDate = dateInput.value; - if (!selectedDate) { - showError('请选择查询日期'); - return; - } - - showLoading(); - hideError(); - hideLunarInfo(); - - try { - const data = await fetchLunarData(selectedDate); - displayLunarInfo(data.data); - updateQueryTime(); - } catch (error) { - console.error('查询失败:', error); - showError('查询农历信息失败,请稍后重试'); - } - - hideLoading(); -} - -// 获取农历数据 -async function fetchLunarData(date) { - for (let i = 0; i < API_ENDPOINTS.length; i++) { - const apiUrl = API_ENDPOINTS[currentApiIndex]; - - try { - const response = await fetch(`${apiUrl}/v2/lunar?date=${date}`, { - method: 'GET', - headers: { - 'Accept': 'application/json', - }, - timeout: 10000 - }); - - if (!response.ok) { - throw new Error(`HTTP ${response.status}`); - } - - const data = await response.json(); - - if (data.code === 200 && data.data) { - return data; - } else { - throw new Error('数据格式错误'); - } - } catch (error) { - console.error(`API ${apiUrl} 请求失败:`, error); - currentApiIndex = (currentApiIndex + 1) % API_ENDPOINTS.length; - - if (i === API_ENDPOINTS.length - 1) { - throw new Error('所有API接口都无法访问'); - } - } - } -} - -// 显示农历信息 -function displayLunarInfo(lunarData) { - lunarInfoElement.innerHTML = ` -
    -
    -
    📅
    -
    公历信息
    -
    -
    -
    -
    🗓️
    -
    公历日期
    -
    ${lunarData.solar.year}年${String(lunarData.solar.month).padStart(2, '0')}月${String(lunarData.solar.day).padStart(2, '0')}日
    -
    -
    -
    🌍
    -
    星期
    -
    ${lunarData.solar.week_desc}
    -
    -
    -
    -
    季节
    -
    ${lunarData.solar.season_name_desc}
    -
    -
    -
    -
    星座
    -
    ${lunarData.constellation.name}
    -
    -
    -
    - -
    -
    -
    🌙
    -
    农历信息
    -
    -
    -
    -
    🏮
    -
    农历日期
    -
    ${lunarData.lunar.desc_short}
    -
    -
    -
    🐲
    -
    生肖年
    -
    ${lunarData.zodiac.year}年
    -
    -
    -
    -
    天干地支
    -
    ${lunarData.sixty_cycle.year.name}
    -
    -
    -
    🌙
    -
    月相
    -
    ${lunarData.phase.name}
    -
    -
    -
    - -
    -
    -
    🌸
    -
    节气节日
    -
    -
    -
    -
    🍃
    -
    当前节气
    -
    ${lunarData.term.stage ? lunarData.term.stage.name : '无节气'}
    -
    -
    -
    🎊
    -
    法定假日
    -
    ${lunarData.legal_holiday ? lunarData.legal_holiday.name : '无假日'}
    -
    -
    -
    -
    传统节日
    -
    ${lunarData.festival.both_desc || '无特殊节日'}
    -
    -
    -
    🔢
    -
    一年第几天
    -
    第${lunarData.stats.day_of_year}天
    -
    -
    -
    - -
    -
    -
    -
    时辰干支
    -
    -
    -
    -
    🕐
    -
    当前时辰
    -
    ${lunarData.lunar.hour_desc}
    -
    -
    -
    -
    时辰干支
    -
    ${lunarData.sixty_cycle.hour.name}
    -
    -
    -
    🐓
    -
    时辰生肖
    -
    ${lunarData.zodiac.hour}
    -
    -
    -
    🎵
    -
    纳音
    -
    ${lunarData.nayin.hour}
    -
    -
    -
    - -
    -
    -
    🔮
    -
    黄历宜忌
    -
    -
    -
    -
    -
    -
    ${formatTabooText(lunarData.taboo.day.recommends)}
    -
    -
    -
    -
    -
    ${formatTabooText(lunarData.taboo.day.avoids)}
    -
    -
    -
    🕐
    -
    时辰宜
    -
    ${formatTabooText(lunarData.taboo.hour.recommends)}
    -
    -
    -
    🚫
    -
    时辰忌
    -
    ${formatTabooText(lunarData.taboo.hour.avoids)}
    -
    -
    -
    - -
    -
    -
    🌟
    -
    运势财运
    -
    -
    -
    -
    🎯
    -
    今日运势
    -
    ${lunarData.fortune.today_luck}
    -
    -
    -
    💼
    -
    事业运
    -
    ${lunarData.fortune.career}
    -
    -
    -
    💰
    -
    财运
    -
    ${lunarData.fortune.money}
    -
    -
    -
    💕
    -
    感情运
    -
    ${lunarData.fortune.love}
    -
    -
    -
    - -
    -
    -
    📊
    -
    年度统计
    -
    -
    -
    -
    📈
    -
    年度进度
    -
    ${lunarData.stats.percents_formatted.year}
    -
    -
    -
    📅
    -
    本月进度
    -
    ${lunarData.stats.percents_formatted.month}
    -
    -
    -
    🗓️
    -
    本周第几天
    -
    第${lunarData.stats.week_of_month}周
    -
    -
    -
    -
    今日进度
    -
    ${lunarData.stats.percents_formatted.day}
    -
    -
    -
    - - ${generateHourlyTaboo(lunarData.taboo.hours)} - `; - - showLunarInfo(); -} - -// 格式化宜忌文本 -function formatTabooText(text) { - if (!text) return '无'; - return text.replace(/\./g, '、'); -} - -// 生成十二时辰宜忌 -function generateHourlyTaboo(hours) { - if (!hours || hours.length === 0) return ''; - - const hourCards = hours.map(hour => ` -
    -
    ${hour.hour}
    -
    -
    - 宜: - ${formatTabooText(hour.recommends) || '无'} -
    -
    - 忌: - ${formatTabooText(hour.avoids) || '无'} -
    -
    -
    - `).join(''); - - return ` -
    -
    -
    -
    十二时辰宜忌
    -
    -
    -
    - ${hourCards} -
    -
    -
    - `; -} - -// 更新查询时间 -function updateQueryTime() { - const now = new Date(); - const timeStr = now.toLocaleString('zh-CN', { - year: 'numeric', - month: '2-digit', - day: '2-digit', - hour: '2-digit', - minute: '2-digit', - second: '2-digit' - }); - updateTimeElement.textContent = `查询时间: ${timeStr}`; - - // 添加成功提示 - showSuccessMessage('🌙 农历信息已更新'); -} - -// 显示成功消息 -function showSuccessMessage(message) { - // 移除之前的提示 - const existingToast = document.querySelector('.success-toast'); - if (existingToast) { - existingToast.remove(); - } - - const toast = document.createElement('div'); - toast.className = 'success-toast'; - toast.textContent = message; - toast.style.cssText = ` - position: fixed; - top: 20px; - right: 20px; - background: rgba(255, 255, 255, 0.2); - backdrop-filter: blur(15px); - -webkit-backdrop-filter: blur(15px); - color: rgba(255, 255, 255, 0.95); - padding: 12px 20px; - border-radius: 25px; - border: 1px solid rgba(255, 255, 255, 0.3); - box-shadow: 0 8px 32px rgba(31, 38, 135, 0.2); - z-index: 1000; - font-weight: 600; - font-size: 0.9em; - animation: glassToastSlide 0.5s ease-out; - text-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); - `; - - document.body.appendChild(toast); - - // 3秒后自动移除 - setTimeout(() => { - toast.style.animation = 'glassToastSlideOut 0.5s ease-in forwards'; - setTimeout(() => toast.remove(), 500); - }, 3000); -} - -// 显示加载状态 -function showLoading() { - loadingElement.style.display = 'block'; -} - -// 隐藏加载状态 -function hideLoading() { - loadingElement.style.display = 'none'; -} - -// 显示农历信息 -function showLunarInfo() { - lunarInfoElement.style.display = 'block'; -} - -// 隐藏农历信息 -function hideLunarInfo() { - lunarInfoElement.style.display = 'none'; -} - -// 显示错误信息 -function showError(message = '查询失败,请稍后重试') { - errorMessageElement.style.display = 'block'; - const errorContent = errorMessageElement.querySelector('.error-content p'); - if (errorContent) { - errorContent.textContent = message; - } -} - -// 隐藏错误信息 -function hideError() { - errorMessageElement.style.display = 'none'; -} - -// 添加CSS动画到页面 -if (!document.querySelector('#toast-styles')) { - const style = document.createElement('style'); - style.id = 'toast-styles'; - style.textContent = ` - @keyframes glassToastSlide { - from { - opacity: 0; - transform: translateX(100px) scale(0.8); - } - to { - opacity: 1; - transform: translateX(0) scale(1); - } - } - - @keyframes glassToastSlideOut { - from { - opacity: 1; - transform: translateX(0) scale(1); - } - to { - opacity: 0; - transform: translateX(100px) scale(0.8); - } - } - `; - document.head.appendChild(style); -} - -// 键盘快捷键支持 -document.addEventListener('keydown', function(e) { - if (e.key === 'Enter') { - e.preventDefault(); - queryLunarInfo(); - } - - if (e.key === 'r' && (e.ctrlKey || e.metaKey)) { - e.preventDefault(); - queryLunarInfo(); - } -}); diff --git a/frontend/react-app/public/60sapi/实用功能/农历信息/接口集合.json b/frontend/react-app/public/60sapi/实用功能/农历信息/接口集合.json deleted file mode 100644 index 04e92b7f..00000000 --- a/frontend/react-app/public/60sapi/实用功能/农历信息/接口集合.json +++ /dev/null @@ -1,7 +0,0 @@ -[ - "https://60s-cf.viki.moe", - "https://60s.viki.moe", - "https://60s.b23.run", - "https://60s.114128.xyz", - "https://60s-cf.114128.xyz" -] diff --git a/frontend/react-app/public/60sapi/实用功能/农历信息/返回接口.json b/frontend/react-app/public/60sapi/实用功能/农历信息/返回接口.json deleted file mode 100644 index 910981d4..00000000 --- a/frontend/react-app/public/60sapi/实用功能/农历信息/返回接口.json +++ /dev/null @@ -1,647 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": { - "solar": { - "year": 2025, - "month": 9, - "day": 1, - "hour": 17, - "minute": 58, - "second": 47, - "full": "2025-09-01", - "full_with_time": "2025-09-01 17:58:47", - "week": 1, - "week_desc": "星期一", - "week_desc_short": "一", - "season": 3, - "season_desc": "三季度", - "season_desc_short": "三", - "season_name": "秋", - "season_name_desc": "秋天", - "is_leap_year": false - }, - "lunar": { - "year": "乙巳", - "month": "七", - "day": "初十", - "hour": "酉", - "full_with_hour": "农历乙巳年七月初十酉时", - "desc_short": "农历乙巳年七月初十", - "year_desc": "农历乙巳年", - "month_desc": "七月", - "day_desc": "初十", - "hour_desc": "酉时", - "is_leap_month": false - }, - "stats": { - "day_of_year": 244, - "week_of_year": 36, - "week_of_month": 1, - "percents": { - "year": 0.665753424657534, - "month": 0.0333333333333333, - "week": 0.142857142857143, - "day": 0.749161909722222 - }, - "percents_formatted": { - "year": "66.58%", - "month": "3.33%", - "week": "14.29%", - "day": "74.92%" - } - }, - "term": { - "today": null, - "stage": { - "name": "处暑", - "position": 10, - "is_jie": false, - "is_qi": true - } - }, - "zodiac": { - "year": "蛇", - "month": "鸡", - "day": "鸡", - "hour": "鸡" - }, - "sixty_cycle": { - "year": { - "heaven_stem": "乙", - "earth_branch": "巳", - "name": "乙巳年", - "name_short": "乙巳" - }, - "month": { - "heaven_stem": "乙", - "earth_branch": "酉", - "name": "乙酉月", - "name_short": "乙酉" - }, - "day": { - "heaven_stem": "癸", - "earth_branch": "酉", - "name": "癸酉日", - "name_short": "癸酉" - }, - "hour": { - "heaven_stem": "辛", - "earth_branch": "酉", - "name": "辛酉时", - "name_short": "辛酉" - } - }, - "legal_holiday": null, - "festival": { - "solar": null, - "lunar": null, - "both_desc": null - }, - "phase": { - "name": "宵月", - "position": 10 - }, - "constellation": { - "name": "处女座", - "name_short": "处女" - }, - "taboo": { - "day": { - "recommends": "解除.祭祀.祈福.求嗣.修造.动土.竖柱.上梁.安床.纳畜.盖屋.合脊.起基.入殓.破土.安葬", - "avoids": "出火.嫁娶.开光.进人口.出行.词讼.开市.入宅.移徙.赴任" - }, - "hour": { - "hour": "酉时", - "hour_short": "酉", - "avoids": "乘船.造桥", - "recommends": "嫁娶.出行.移徙.入宅.开市.赴任.祈福.安床.开仓.盖屋.修造.求财" - }, - "hours": [ - { - "hour": "酉时", - "hour_short": "酉", - "recommends": "嫁娶.出行.移徙.入宅.开市.赴任.祈福.安床.开仓.盖屋.修造.求财", - "avoids": "乘船.造桥" - }, - { - "hour": "戌时", - "hour_short": "戌", - "recommends": "嫁娶.移徙.安葬.进人口.求财", - "avoids": "出行.赴任.祈福.祭祀.开光.斋醮" - }, - { - "hour": "亥时", - "hour_short": "亥", - "recommends": "嫁娶.移徙.交易.入宅.开市.安葬.求嗣.求财", - "avoids": "出行.赴任.动土.祈福.祭祀.修造.开光.斋醮" - }, - { - "hour": "子时", - "hour_short": "子", - "recommends": "嫁娶.交易.入宅.开市.祈福.安葬.求嗣.求财", - "avoids": "出行.移徙.赴任.词讼.修造" - }, - { - "hour": "丑时", - "hour_short": "丑", - "recommends": "嫁娶.祈福.安葬.祭祀.酬神.求财", - "avoids": "出行.赴任.动土.修造" - }, - { - "hour": "寅时", - "hour_short": "寅", - "recommends": "嫁娶.出行.交易.开市.赴任.祈福.安床.祭祀.求嗣.求财", - "avoids": "盖屋.入殓.上梁" - }, - { - "hour": "卯时", - "hour_short": "卯", - "recommends": "嫁娶.交易.入宅.开市.祈福.安床.安葬.求嗣.求财", - "avoids": "出行.赴任.修造" - }, - { - "hour": "辰时", - "hour_short": "辰", - "recommends": "", - "avoids": "诸事不宜" - }, - { - "hour": "巳时", - "hour_short": "巳", - "recommends": "嫁娶.出行.移徙.入宅.开市.祈福.安床.盖屋.祭祀.作灶", - "avoids": "安葬.修造.开光" - }, - { - "hour": "午时", - "hour_short": "午", - "recommends": "嫁娶.出行.交易.开市.祈福.安床.求嗣.求财", - "avoids": "赴任.动土.词讼.修造" - }, - { - "hour": "未时", - "hour_short": "未", - "recommends": "嫁娶.入宅.祈福.安葬.祭祀.修造.酬神.求财", - "avoids": "出行.赴任" - }, - { - "hour": "申时", - "hour_short": "申", - "recommends": "嫁娶.出行.开市.赴任.安葬.求财", - "avoids": "祈福.祭祀.酬神.斋醮" - } - ] - }, - "julian_day": 2460919.5, - "nayin": { - "year": "覆灯火", - "month": "泉中水", - "day": "剑锋金", - "hour": "石榴木" - }, - "baizi": { - "year_baizi": "性格温和,为人正直诚信。", - "day_baizi": "性格温和,为人正直诚信。" - }, - "fortune": { - "today_luck": "今日学习运好,适合进修", - "career": "领导能力突出,升职有望", - "money": "偏财运不错,可小试投资", - "love": "感情需要沟通,避免误会" - }, - "constants": { - "legal_holiday_list": [ - { - "name": "元旦节", - "date": "2025-01-01", - "start": "2025-01-01", - "end": "2025-01-01" - }, - { - "name": "春节", - "date": "2025-01-29", - "start": "2025-01-26", - "end": "2025-02-08" - }, - { - "name": "清明节", - "date": "2025-04-04", - "start": "2025-04-04", - "end": "2025-04-06" - }, - { - "name": "劳动节", - "date": "2025-05-01", - "start": "2025-04-27", - "end": "2025-05-05" - }, - { - "name": "端午节", - "date": "2025-05-31", - "start": "2025-05-31", - "end": "2025-06-02" - }, - { - "name": "国庆中秋", - "date": "2025-10-01", - "start": "2025-09-28", - "end": "2025-10-11" - } - ], - "phase_list": [ - { - "name": "朔月", - "lunar_day": 1 - }, - { - "name": "既朔月", - "lunar_day": 2 - }, - { - "name": "蛾眉新月", - "lunar_day": 3 - }, - { - "name": "蛾眉新月", - "lunar_day": 4 - }, - { - "name": "蛾眉月", - "lunar_day": 5 - }, - { - "name": "夕月", - "lunar_day": 6 - }, - { - "name": "上弦月", - "lunar_day": 7 - }, - { - "name": "上弦月", - "lunar_day": 8 - }, - { - "name": "九夜月", - "lunar_day": 9 - }, - { - "name": "宵月", - "lunar_day": 10 - }, - { - "name": "宵月", - "lunar_day": 11 - }, - { - "name": "宵月", - "lunar_day": 12 - }, - { - "name": "渐盈凸月", - "lunar_day": 13 - }, - { - "name": "小望月", - "lunar_day": 14 - }, - { - "name": "望月", - "lunar_day": 15 - }, - { - "name": "既望月", - "lunar_day": 16 - }, - { - "name": "立待月", - "lunar_day": 17 - }, - { - "name": "居待月", - "lunar_day": 18 - }, - { - "name": "寝待月", - "lunar_day": 19 - }, - { - "name": "更待月", - "lunar_day": 20 - }, - { - "name": "渐亏凸月", - "lunar_day": 21 - }, - { - "name": "下弦月", - "lunar_day": 22 - }, - { - "name": "下弦月", - "lunar_day": 23 - }, - { - "name": "有明月", - "lunar_day": 24 - }, - { - "name": "有明月", - "lunar_day": 25 - }, - { - "name": "蛾眉残月", - "lunar_day": 26 - }, - { - "name": "蛾眉残月", - "lunar_day": 27 - }, - { - "name": "残月", - "lunar_day": 28 - }, - { - "name": "晓月", - "lunar_day": 29 - }, - { - "name": "晦月", - "lunar_day": 30 - } - ], - "zodiac_list": [ - "鼠", - "牛", - "虎", - "兔", - "龙", - "蛇", - "马", - "羊", - "猴", - "鸡", - "狗", - "猪" - ], - "constellation_list": [ - { - "name": "白羊", - "desc": "白羊座", - "start": "3月21日", - "end": "4月19日", - "range": "3月21日~4月19日", - "start_month": 3, - "start_day": 21, - "end_month": 4, - "end_day": 19 - }, - { - "name": "金牛", - "desc": "金牛座", - "start": "4月20日", - "end": "5月20日", - "range": "4月20日~5月20日", - "start_month": 4, - "start_day": 20, - "end_month": 5, - "end_day": 20 - }, - { - "name": "双子", - "desc": "双子座", - "start": "5月21日", - "end": "6月21日", - "range": "5月21日~6月21日", - "start_month": 5, - "start_day": 21, - "end_month": 6, - "end_day": 21 - }, - { - "name": "巨蟹", - "desc": "巨蟹座", - "start": "6月22日", - "end": "7月22日", - "range": "6月22日~7月22日", - "start_month": 6, - "start_day": 22, - "end_month": 7, - "end_day": 22 - }, - { - "name": "狮子", - "desc": "狮子座", - "start": "7月23日", - "end": "8月22日", - "range": "7月23日~8月22日", - "start_month": 7, - "start_day": 23, - "end_month": 8, - "end_day": 22 - }, - { - "name": "处女", - "desc": "处女座", - "start": "8月23日", - "end": "9月22日", - "range": "8月23日~9月22日", - "start_month": 8, - "start_day": 23, - "end_month": 9, - "end_day": 22 - }, - { - "name": "天秤", - "desc": "天秤座", - "start": "9月23日", - "end": "10月23日", - "range": "9月23日~10月23日", - "start_month": 9, - "start_day": 23, - "end_month": 10, - "end_day": 23 - }, - { - "name": "天蝎", - "desc": "天蝎座", - "start": "10月24日", - "end": "11月22日", - "range": "10月24日~11月22日", - "start_month": 10, - "start_day": 24, - "end_month": 11, - "end_day": 22 - }, - { - "name": "射手", - "desc": "射手座", - "start": "11月23日", - "end": "12月21日", - "range": "11月23日~12月21日", - "start_month": 11, - "start_day": 23, - "end_month": 12, - "end_day": 21 - }, - { - "name": "摩羯", - "desc": "摩羯座", - "start": "12月22日", - "end": "1月19日", - "range": "12月22日~1月19日", - "start_month": 12, - "start_day": 22, - "end_month": 1, - "end_day": 19 - }, - { - "name": "水瓶", - "desc": "水瓶座", - "start": "1月20日", - "end": "2月18日", - "range": "1月20日~2月18日", - "start_month": 1, - "start_day": 20, - "end_month": 2, - "end_day": 18 - }, - { - "name": "双鱼", - "desc": "双鱼座", - "start": "2月19日", - "end": "3月20日", - "range": "2月19日~3月20日", - "start_month": 2, - "start_day": 19, - "end_month": 3, - "end_day": 20 - } - ], - "heaven_stems": [ - "甲", - "乙", - "丙", - "丁", - "戊", - "己", - "庚", - "辛", - "壬", - "癸" - ], - "earth_branches": [ - "子", - "丑", - "寅", - "卯", - "辰", - "巳", - "午", - "未", - "申", - "酉", - "戌", - "亥" - ], - "solar_terms": [ - { - "name": "立春", - "desc": "春季开始" - }, - { - "name": "雨水", - "desc": "降雨增多" - }, - { - "name": "惊蛰", - "desc": "春雷乍响" - }, - { - "name": "春分", - "desc": "昼夜等长" - }, - { - "name": "清明", - "desc": "天清地明" - }, - { - "name": "谷雨", - "desc": "雨生百谷" - }, - { - "name": "立夏", - "desc": "夏季开始" - }, - { - "name": "小满", - "desc": "麦粒渐满" - }, - { - "name": "芒种", - "desc": "麦类收割" - }, - { - "name": "夏至", - "desc": "白昼最长" - }, - { - "name": "小暑", - "desc": "天气渐热" - }, - { - "name": "大暑", - "desc": "一年最热" - }, - { - "name": "立秋", - "desc": "秋季开始" - }, - { - "name": "处暑", - "desc": "暑热结束" - }, - { - "name": "白露", - "desc": "露水增多" - }, - { - "name": "秋分", - "desc": "昼夜等长" - }, - { - "name": "寒露", - "desc": "露水渐凉" - }, - { - "name": "霜降", - "desc": "开始降霜" - }, - { - "name": "立冬", - "desc": "冬季开始" - }, - { - "name": "小雪", - "desc": "开始降雪" - }, - { - "name": "大雪", - "desc": "降雪增多" - }, - { - "name": "冬至", - "desc": "白昼最短" - }, - { - "name": "小寒", - "desc": "天气渐冷" - }, - { - "name": "大寒", - "desc": "一年最冷" - } - ] - } - } -} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/实用功能/实时天气/css/background.css b/frontend/react-app/public/60sapi/实用功能/实时天气/css/background.css deleted file mode 100644 index a9872b38..00000000 --- a/frontend/react-app/public/60sapi/实用功能/实时天气/css/background.css +++ /dev/null @@ -1,145 +0,0 @@ -/* 背景样式文件 */ -body { - background: linear-gradient(135deg, #e8f5e8 0%, #d4f1d4 25%, #c8ecc8 50%, #b8e6b8 75%, #a8d5ba 100%); - background-attachment: fixed; - background-size: 400% 400%; - animation: gradientShift 15s ease infinite; - position: relative; - overflow-x: hidden; -} - -/* 背景渐变动画 */ -@keyframes gradientShift { - 0% { - background-position: 0% 50%; - } - 50% { - background-position: 100% 50%; - } - 100% { - background-position: 0% 50%; - } -} - -/* 背景装饰元素 */ -body::before { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - radial-gradient(circle at 20% 80%, rgba(168, 213, 186, 0.1) 0%, transparent 50%), - radial-gradient(circle at 80% 20%, rgba(107, 183, 123, 0.1) 0%, transparent 50%), - radial-gradient(circle at 40% 40%, rgba(200, 236, 200, 0.1) 0%, transparent 50%); - pointer-events: none; - z-index: -1; -} - -/* 浮动装饰圆点 */ -body::after { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - radial-gradient(2px 2px at 20px 30px, rgba(168, 213, 186, 0.3), transparent), - radial-gradient(2px 2px at 40px 70px, rgba(107, 183, 123, 0.2), transparent), - radial-gradient(1px 1px at 90px 40px, rgba(200, 236, 200, 0.4), transparent), - radial-gradient(1px 1px at 130px 80px, rgba(168, 213, 186, 0.2), transparent), - radial-gradient(2px 2px at 160px 30px, rgba(107, 183, 123, 0.3), transparent); - background-repeat: repeat; - background-size: 200px 100px; - animation: float 20s linear infinite; - pointer-events: none; - z-index: -1; -} - -@keyframes float { - 0% { - transform: translateY(0px); - } - 50% { - transform: translateY(-10px); - } - 100% { - transform: translateY(0px); - } -} - -/* 云朵装饰效果 */ -.container::before { - content: ''; - position: absolute; - top: -50px; - right: -50px; - width: 200px; - height: 100px; - background: rgba(255, 255, 255, 0.1); - border-radius: 50px; - box-shadow: - -30px 20px 0 rgba(255, 255, 255, 0.08), - 30px 40px 0 rgba(255, 255, 255, 0.06); - animation: cloudFloat 25s ease-in-out infinite; - pointer-events: none; - z-index: -1; -} - -.container::after { - content: ''; - position: absolute; - bottom: -30px; - left: -30px; - width: 150px; - height: 80px; - background: rgba(255, 255, 255, 0.08); - border-radius: 40px; - box-shadow: - 20px 15px 0 rgba(255, 255, 255, 0.06), - -20px 25px 0 rgba(255, 255, 255, 0.04); - animation: cloudFloat 30s ease-in-out infinite reverse; - pointer-events: none; - z-index: -1; -} - -@keyframes cloudFloat { - 0%, 100% { - transform: translateX(0px) translateY(0px); - } - 25% { - transform: translateX(20px) translateY(-10px); - } - 50% { - transform: translateX(-10px) translateY(-20px); - } - 75% { - transform: translateX(15px) translateY(-5px); - } -} - -/* 响应式背景调整 */ -@media (max-width: 768px) { - body::after { - background-size: 150px 75px; - } - - .container::before, - .container::after { - display: none; - } -} - -@media (max-width: 480px) { - body { - background: linear-gradient(135deg, #e8f5e8 0%, #d4f1d4 50%, #a8d5ba 100%); - animation: none; - } - - body::before, - body::after { - display: none; - } -} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/实用功能/实时天气/css/style.css b/frontend/react-app/public/60sapi/实用功能/实时天气/css/style.css deleted file mode 100644 index 8a1e29f0..00000000 --- a/frontend/react-app/public/60sapi/实用功能/实时天气/css/style.css +++ /dev/null @@ -1,409 +0,0 @@ -/* 基础样式重置 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: 'Microsoft YaHei', Arial, sans-serif; - line-height: 1.6; - color: #333; - min-height: 100vh; -} - -.container { - max-width: 1200px; - margin: 0 auto; - padding: 20px; -} - -/* 头部样式 */ -.header { - text-align: center; - margin-bottom: 30px; -} - -.header h1 { - color: #2d5a3d; - font-size: 2.5rem; - font-weight: 300; - margin-bottom: 10px; -} - -/* 搜索区域 */ -.search-section { - margin-bottom: 30px; -} - -.search-box { - display: flex; - justify-content: center; - gap: 10px; - max-width: 500px; - margin: 0 auto; -} - -#cityInput { - flex: 1; - padding: 12px 16px; - border: 2px solid #a8d5ba; - border-radius: 25px; - font-size: 16px; - outline: none; - transition: all 0.3s ease; - background: rgba(255, 255, 255, 0.9); -} - -#cityInput:focus { - border-color: #6bb77b; - box-shadow: 0 0 10px rgba(107, 183, 123, 0.3); -} - -#searchBtn { - padding: 12px 24px; - background: linear-gradient(135deg, #6bb77b, #5a9f6a); - color: white; - border: none; - border-radius: 25px; - font-size: 16px; - cursor: pointer; - transition: all 0.3s ease; - white-space: nowrap; -} - -#searchBtn:hover { - background: linear-gradient(135deg, #5a9f6a, #4a8759); - transform: translateY(-2px); - box-shadow: 0 4px 12px rgba(107, 183, 123, 0.4); -} - -/* 加载动画 */ -.loading { - text-align: center; - padding: 40px; -} - -.spinner { - width: 40px; - height: 40px; - border: 4px solid #e8f5e8; - border-top: 4px solid #6bb77b; - border-radius: 50%; - animation: spin 1s linear infinite; - margin: 0 auto 20px; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -/* 天气容器 */ -.weather-container { - background: rgba(255, 255, 255, 0.95); - border-radius: 20px; - padding: 30px; - box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1); - backdrop-filter: blur(10px); - border: 1px solid rgba(168, 213, 186, 0.3); -} - -/* 位置信息 */ -.location-info { - text-align: center; - margin-bottom: 30px; - padding-bottom: 20px; - border-bottom: 2px solid #e8f5e8; -} - -.location-info h2 { - color: #2d5a3d; - font-size: 2rem; - margin-bottom: 5px; -} - -.location-info p { - color: #666; - font-size: 14px; -} - -/* 当前天气 */ -.current-weather { - margin-bottom: 30px; -} - -.weather-main { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 25px; -} - -.temperature { - font-size: 4rem; - font-weight: 300; - color: #2d5a3d; -} - -.unit { - font-size: 2rem; - color: #6bb77b; -} - -.weather-desc p:first-child { - font-size: 1.5rem; - color: #2d5a3d; - margin-bottom: 5px; -} - -.weather-desc p:last-child { - color: #666; - font-size: 14px; -} - -/* 天气详情 */ -.weather-details { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); - gap: 15px; -} - -.detail-item { - background: rgba(168, 213, 186, 0.1); - padding: 15px; - border-radius: 12px; - text-align: center; - border: 1px solid rgba(168, 213, 186, 0.2); -} - -.detail-item .label { - display: block; - color: #666; - font-size: 12px; - margin-bottom: 5px; - text-transform: uppercase; - letter-spacing: 0.5px; -} - -.detail-item span:last-child { - color: #2d5a3d; - font-weight: 600; - font-size: 16px; -} - -/* 生活指数 */ -.life-index { - margin-top: 30px; -} - -.life-index h3 { - color: #2d5a3d; - font-size: 1.5rem; - margin-bottom: 20px; - text-align: center; -} - -.index-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); - gap: 20px; -} - -.index-item { - display: flex; - align-items: center; - background: rgba(168, 213, 186, 0.05); - padding: 20px; - border-radius: 15px; - border: 1px solid rgba(168, 213, 186, 0.2); - transition: all 0.3s ease; -} - -.index-item:hover { - background: rgba(168, 213, 186, 0.1); - transform: translateY(-2px); - box-shadow: 0 4px 12px rgba(168, 213, 186, 0.2); -} - -.index-icon { - font-size: 2rem; - margin-right: 15px; - width: 50px; - text-align: center; -} - -.index-content h4 { - color: #2d5a3d; - font-size: 16px; - margin-bottom: 5px; -} - -.index-content p { - color: #6bb77b; - font-weight: 600; - margin-bottom: 3px; -} - -.index-content span { - color: #666; - font-size: 13px; - line-height: 1.4; -} - -/* 更新时间 */ -.update-time { - text-align: center; - margin-top: 30px; - padding-top: 20px; - border-top: 1px solid #e8f5e8; - color: #666; - font-size: 14px; -} - -/* 错误信息 */ -.error-message { - text-align: center; - padding: 40px; - background: rgba(255, 107, 107, 0.1); - border-radius: 15px; - border: 1px solid rgba(255, 107, 107, 0.2); - color: #d63031; -} - -/* 平板端适配 (768px - 1024px) */ -@media (min-width: 768px) and (max-width: 1024px) { - .container { - padding: 25px; - } - - .header h1 { - font-size: 2.2rem; - } - - .temperature { - font-size: 3.5rem; - } - - .weather-details { - grid-template-columns: repeat(3, 1fr); - } - - .index-grid { - grid-template-columns: repeat(2, 1fr); - } -} - -/* 电脑端适配 (1024px+) */ -@media (min-width: 1024px) { - .container { - padding: 40px; - } - - .weather-container { - padding: 40px; - } - - .weather-main { - justify-content: space-around; - } - - .weather-details { - grid-template-columns: repeat(6, 1fr); - } - - .index-grid { - grid-template-columns: repeat(3, 1fr); - } - - .search-box { - max-width: 600px; - } -} - -/* 手机端适配 (768px以下) */ -@media (max-width: 767px) { - .container { - padding: 15px; - } - - .header h1 { - font-size: 2rem; - } - - .search-box { - flex-direction: column; - gap: 15px; - } - - #searchBtn { - padding: 14px 24px; - } - - .weather-container { - padding: 20px; - margin: 0 -5px; - } - - .weather-main { - flex-direction: column; - text-align: center; - gap: 20px; - } - - .temperature { - font-size: 3rem; - } - - .weather-details { - grid-template-columns: repeat(2, 1fr); - gap: 10px; - } - - .detail-item { - padding: 12px; - } - - .index-grid { - grid-template-columns: 1fr; - gap: 15px; - } - - .index-item { - padding: 15px; - } - - .index-icon { - font-size: 1.5rem; - width: 40px; - margin-right: 12px; - } -} - -/* 超小屏幕适配 (480px以下) */ -@media (max-width: 480px) { - .container { - padding: 10px; - } - - .header h1 { - font-size: 1.8rem; - } - - .weather-container { - padding: 15px; - border-radius: 15px; - } - - .temperature { - font-size: 2.5rem; - } - - .weather-details { - grid-template-columns: 1fr; - } - - .detail-item { - padding: 10px; - } -} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/实用功能/实时天气/index.html b/frontend/react-app/public/60sapi/实用功能/实时天气/index.html deleted file mode 100644 index 474571a4..00000000 --- a/frontend/react-app/public/60sapi/实用功能/实时天气/index.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - - - 实时天气查询 - - - - -
    -
    -

    实时天气查询

    -
    - -
    - -
    - - - - - - -
    - - - - \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/实用功能/实时天气/js/script.js b/frontend/react-app/public/60sapi/实用功能/实时天气/js/script.js deleted file mode 100644 index a3aaacda..00000000 --- a/frontend/react-app/public/60sapi/实用功能/实时天气/js/script.js +++ /dev/null @@ -1,252 +0,0 @@ -// 天气查询应用 -class WeatherApp { - constructor() { - this.apiEndpoints = [ - 'https://60s-cf.viki.moe', - 'https://60s.viki.moe', - 'https://60s.b23.run', - 'https://60s.114128.xyz', - 'https://60s-cf.114128.xyz' - ]; - this.currentEndpointIndex = 0; - this.init(); - } - - init() { - this.bindEvents(); - // 页面加载时自动查询北京天气 - this.searchWeather('北京'); - } - - bindEvents() { - const searchBtn = document.getElementById('searchBtn'); - const cityInput = document.getElementById('cityInput'); - - searchBtn.addEventListener('click', () => { - const city = cityInput.value.trim(); - if (city) { - this.searchWeather(city); - } else { - this.showError('请输入城市名称'); - } - }); - - cityInput.addEventListener('keypress', (e) => { - if (e.key === 'Enter') { - const city = cityInput.value.trim(); - if (city) { - this.searchWeather(city); - } else { - this.showError('请输入城市名称'); - } - } - }); - - // 防止输入框为空时查询 - cityInput.addEventListener('input', () => { - const searchBtn = document.getElementById('searchBtn'); - searchBtn.disabled = !cityInput.value.trim(); - }); - } - - async searchWeather(city) { - this.showLoading(); - - for (let i = 0; i < this.apiEndpoints.length; i++) { - try { - const endpoint = this.apiEndpoints[this.currentEndpointIndex]; - const response = await this.fetchWeatherData(endpoint, city); - - if (response && response.code === 200) { - this.displayWeatherData(response.data); - return; - } - } catch (error) { - console.warn(`API ${this.apiEndpoints[this.currentEndpointIndex]} 请求失败:`, error); - } - - // 切换到下一个API端点 - this.currentEndpointIndex = (this.currentEndpointIndex + 1) % this.apiEndpoints.length; - } - - // 所有API都失败了 - this.showError('获取天气信息失败,请检查网络连接或稍后重试'); - } - - async fetchWeatherData(endpoint, city) { - const url = `${endpoint}/v2/weather?query=${encodeURIComponent(city)}`; - - const response = await fetch(url, { - method: 'GET', - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - }, - timeout: 10000 - }); - - if (!response.ok) { - throw new Error(`HTTP ${response.status}`); - } - - return await response.json(); - } - - displayWeatherData(data) { - const { location, realtime } = data; - - // 显示位置信息 - document.getElementById('locationName').textContent = location.formatted; - document.getElementById('locationDetail').textContent = - `${location.province} ${location.city} | 邮编: ${location.zip_code}`; - - // 显示当前天气 - document.getElementById('temperature').textContent = realtime.temperature; - document.getElementById('weatherCondition').textContent = realtime.weather; - - // 体感温度转换(API返回的是华氏度,需要转换为摄氏度) - const feelsLikeCelsius = this.fahrenheitToCelsius(realtime.temperature_feels_like); - document.getElementById('feelsLike').textContent = - `体感温度 ${feelsLikeCelsius}°C`; - - // 显示天气详情 - document.getElementById('humidity').textContent = `${realtime.humidity}%`; - document.getElementById('windDirection').textContent = realtime.wind_direction; - document.getElementById('windStrength').textContent = realtime.wind_strength; - document.getElementById('pressure').textContent = `${realtime.pressure} hPa`; - document.getElementById('visibility').textContent = realtime.visibility; - - // 空气质量显示 - const aqiElement = document.getElementById('aqi'); - aqiElement.textContent = `${realtime.aqi} (PM2.5: ${realtime.pm25})`; - aqiElement.className = this.getAQIClass(realtime.aqi); - - // 显示生活指数 - const lifeIndex = realtime.life_index; - this.displayLifeIndex('comfort', lifeIndex.comfort); - this.displayLifeIndex('clothing', lifeIndex.clothing); - this.displayLifeIndex('umbrella', lifeIndex.umbrella); - this.displayLifeIndex('uv', lifeIndex.uv); - this.displayLifeIndex('travel', lifeIndex.travel); - this.displayLifeIndex('sport', lifeIndex.sport); - - // 显示更新时间 - document.getElementById('updateTime').textContent = - `${realtime.updated} (${realtime.updated_at})`; - - this.showWeatherContainer(); - } - - displayLifeIndex(type, indexData) { - const levelElement = document.getElementById(`${type}Level`); - const descElement = document.getElementById(`${type}Desc`); - - if (levelElement && descElement && indexData) { - levelElement.textContent = indexData.level; - descElement.textContent = indexData.desc; - - // 根据指数级别设置颜色 - levelElement.className = this.getIndexLevelClass(indexData.level); - } - } - - getAQIClass(aqi) { - if (aqi <= 50) return 'aqi-good'; - if (aqi <= 100) return 'aqi-moderate'; - if (aqi <= 150) return 'aqi-unhealthy-sensitive'; - if (aqi <= 200) return 'aqi-unhealthy'; - if (aqi <= 300) return 'aqi-very-unhealthy'; - return 'aqi-hazardous'; - } - - getIndexLevelClass(level) { - const levelMap = { - '优': 'level-excellent', - '良': 'level-good', - '适宜': 'level-suitable', - '舒适': 'level-comfortable', - '较适宜': 'level-fairly-suitable', - '不宜': 'level-unsuitable', - '较不宜': 'level-fairly-unsuitable', - '带伞': 'level-bring-umbrella', - '最弱': 'level-weakest', - '弱': 'level-weak', - '中等': 'level-moderate', - '强': 'level-strong', - '很强': 'level-very-strong' - }; - - return levelMap[level] || 'level-default'; - } - - // 华氏度转摄氏度 - fahrenheitToCelsius(fahrenheit) { - const celsius = (fahrenheit - 32) * 5 / 9; - return Math.round(celsius * 10) / 10; // 保留一位小数 - } - - showLoading() { - document.getElementById('loading').style.display = 'block'; - document.getElementById('weatherContainer').style.display = 'none'; - document.getElementById('errorMessage').style.display = 'none'; - } - - showWeatherContainer() { - document.getElementById('loading').style.display = 'none'; - document.getElementById('weatherContainer').style.display = 'block'; - document.getElementById('errorMessage').style.display = 'none'; - } - - showError(message) { - document.getElementById('loading').style.display = 'none'; - document.getElementById('weatherContainer').style.display = 'none'; - const errorElement = document.getElementById('errorMessage'); - errorElement.style.display = 'block'; - errorElement.querySelector('p').textContent = message; - } -} - -// 添加生活指数级别样式 -const style = document.createElement('style'); -style.textContent = ` - .aqi-good { color: #52c41a; } - .aqi-moderate { color: #faad14; } - .aqi-unhealthy-sensitive { color: #fa8c16; } - .aqi-unhealthy { color: #f5222d; } - .aqi-very-unhealthy { color: #a0206e; } - .aqi-hazardous { color: #722ed1; } - - .level-excellent, .level-suitable, .level-comfortable { color: #52c41a; } - .level-good, .level-fairly-suitable { color: #1890ff; } - .level-bring-umbrella, .level-moderate { color: #faad14; } - .level-unsuitable, .level-fairly-unsuitable { color: #f5222d; } - .level-weakest, .level-weak { color: #52c41a; } - .level-strong, .level-very-strong { color: #fa8c16; } - .level-default { color: #666; } -`; -document.head.appendChild(style); - -// 页面加载完成后初始化应用 -document.addEventListener('DOMContentLoaded', () => { - new WeatherApp(); -}); - -// 添加页面可见性检测,当页面重新可见时刷新数据 -document.addEventListener('visibilitychange', () => { - if (!document.hidden) { - const cityInput = document.getElementById('cityInput'); - const city = cityInput.value.trim() || '北京'; - // 延迟1秒刷新,避免频繁请求 - setTimeout(() => { - if (window.weatherApp) { - window.weatherApp.searchWeather(city); - } - }, 1000); - } -}); - -// 将应用实例暴露到全局,方便调试和其他功能调用 -window.weatherApp = null; -document.addEventListener('DOMContentLoaded', () => { - window.weatherApp = new WeatherApp(); -}); \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/实用功能/实时天气/接口集合.json b/frontend/react-app/public/60sapi/实用功能/实时天气/接口集合.json deleted file mode 100644 index 04e92b7f..00000000 --- a/frontend/react-app/public/60sapi/实用功能/实时天气/接口集合.json +++ /dev/null @@ -1,7 +0,0 @@ -[ - "https://60s-cf.viki.moe", - "https://60s.viki.moe", - "https://60s.b23.run", - "https://60s.114128.xyz", - "https://60s-cf.114128.xyz" -] diff --git a/frontend/react-app/public/60sapi/实用功能/实时天气/返回接口.json b/frontend/react-app/public/60sapi/实用功能/实时天气/返回接口.json deleted file mode 100644 index a0243aa1..00000000 --- a/frontend/react-app/public/60sapi/实用功能/实时天气/返回接口.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": { - "location": { - "province": "北京", - "city": "北京", - "town": "北京", - "formatted": "北京", - "location_id": "101010100", - "detail_url": "http://www.weather.com.cn/weather/101010100.shtml", - "is_province": true, - "is_city": false, - "is_town": false, - "area_code": "10", - "zip_code": "100000" - }, - "realtime": { - "weather": "小雨转多云", - "weather_desc": "未知", - "weather_code": "d7", - "temperature": 26, - "temperature_feels_like": 81.1, - "humidity": 78, - "wind_direction": "南风转北风", - "wind_strength": "\u003C3级", - "wind_speed": "5km/h", - "pressure": 1008, - "visibility": "8km", - "aqi": 37, - "pm25": 37, - "rainfall": 0, - "rainfall_24h": 0, - "updated": "2025-08-29 08:00:00", - "updated_at": "15:10", - "life_index": { - "comfort": { - "level": "舒适", - "desc": "白天温度宜人,风力不大。" - }, - "clothing": { - "level": "舒适", - "desc": "建议穿长袖衬衫单裤等服装。" - }, - "umbrella": { - "level": "带伞", - "desc": "有降水,带雨伞,短期外出可收起雨伞。" - }, - "uv": { - "level": "最弱", - "desc": "辐射弱,涂擦SPF8-12防晒护肤品。" - }, - "car_wash": { - "level": "不宜", - "desc": "有雨,雨水和泥水会弄脏爱车。" - }, - "travel": { - "level": "适宜", - "desc": "较弱降水和微风将伴您共赴旅程。" - }, - "sport": { - "level": "较不宜", - "desc": "有降水,推荐您在室内进行休闲运动。" - } - } - } - } -} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/实用功能/生成二维码/css/background.css b/frontend/react-app/public/60sapi/实用功能/生成二维码/css/background.css deleted file mode 100644 index f0cd4e04..00000000 --- a/frontend/react-app/public/60sapi/实用功能/生成二维码/css/background.css +++ /dev/null @@ -1,132 +0,0 @@ -/* 背景样式文件 - 独立分离便于迁移 */ - -/* 主背景渐变 */ -body { - background: linear-gradient(135deg, - #e8f5e8 0%, - #f1f8e9 25%, - #e8f5e8 50%, - #c8e6c9 75%, - #e8f5e8 100%); - background-size: 400% 400%; - animation: backgroundShift 15s ease-in-out infinite; - position: relative; -} - -/* 背景动画 */ -@keyframes backgroundShift { - 0%, 100% { - background-position: 0% 50%; - } - 25% { - background-position: 100% 50%; - } - 50% { - background-position: 50% 100%; - } - 75% { - background-position: 50% 0%; - } -} - -/* 背景装饰元素 */ -body::before { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - radial-gradient(circle at 20% 20%, rgba(76, 175, 80, 0.1) 0%, transparent 50%), - radial-gradient(circle at 80% 80%, rgba(129, 199, 132, 0.1) 0%, transparent 50%), - radial-gradient(circle at 40% 60%, rgba(165, 214, 167, 0.08) 0%, transparent 50%); - pointer-events: none; - z-index: -1; - animation: floatingBubbles 20s ease-in-out infinite; -} - -@keyframes floatingBubbles { - 0%, 100% { - transform: translateY(0px) rotate(0deg); - opacity: 1; - } - 33% { - transform: translateY(-20px) rotate(120deg); - opacity: 0.8; - } - 66% { - transform: translateY(10px) rotate(240deg); - opacity: 0.9; - } -} - -/* 背景粒子效果 */ -body::after { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - radial-gradient(2px 2px at 20px 30px, rgba(76, 175, 80, 0.3), transparent), - radial-gradient(2px 2px at 40px 70px, rgba(129, 199, 132, 0.2), transparent), - radial-gradient(1px 1px at 90px 40px, rgba(165, 214, 167, 0.3), transparent), - radial-gradient(1px 1px at 130px 80px, rgba(76, 175, 80, 0.2), transparent), - radial-gradient(2px 2px at 160px 30px, rgba(129, 199, 132, 0.3), transparent); - background-repeat: repeat; - background-size: 200px 100px; - pointer-events: none; - z-index: -1; - animation: particleFloat 25s linear infinite; -} - -@keyframes particleFloat { - 0% { - transform: translateY(0px); - } - 100% { - transform: translateY(-100px); - } -} - -/* 响应式背景调整 */ -@media (max-width: 768px) { - body::after { - background-size: 150px 75px; - animation-duration: 20s; - } - - body::before { - animation-duration: 15s; - } -} - -@media (max-width: 480px) { - body::after { - background-size: 100px 50px; - animation-duration: 15s; - } - - body::before { - animation-duration: 12s; - } - - body { - animation-duration: 12s; - } -} - -/* 高性能模式 - 减少动画 */ -@media (prefers-reduced-motion: reduce) { - body, - body::before, - body::after { - animation: none; - } - - body { - background: linear-gradient(135deg, #e8f5e8 0%, #f1f8e9 50%, #c8e6c9 100%); - } -} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/实用功能/生成二维码/css/style.css b/frontend/react-app/public/60sapi/实用功能/生成二维码/css/style.css deleted file mode 100644 index ca4dd96c..00000000 --- a/frontend/react-app/public/60sapi/实用功能/生成二维码/css/style.css +++ /dev/null @@ -1,468 +0,0 @@ -/* 基础样式重置 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; - line-height: 1.6; - color: #2d5a3d; - min-height: 100vh; - overflow-x: hidden; -} - -/* 容器样式 */ -.container { - max-width: 1200px; - margin: 0 auto; - padding: 20px; - min-height: 100vh; - display: flex; - flex-direction: column; - position: relative; - z-index: 1; -} - -/* 头部样式 */ -.header { - text-align: center; - margin-bottom: 40px; - padding: 40px 20px; - background: rgba(255, 255, 255, 0.95); - backdrop-filter: blur(20px); - border-radius: 20px; - box-shadow: 0 8px 32px rgba(76, 175, 80, 0.1); - border: 1px solid rgba(76, 175, 80, 0.2); - position: relative; - overflow: hidden; -} - -.header::before { - content: ''; - position: absolute; - top: 0; - left: -100%; - width: 100%; - height: 4px; - background: linear-gradient(90deg, transparent, #4caf50, transparent); - animation: headerGlow 3s ease-in-out infinite; -} - -@keyframes headerGlow { - 0% { left: -100%; } - 50% { left: 100%; } - 100% { left: 100%; } -} - -.header h1 { - font-size: 2.5rem; - font-weight: 700; - background: linear-gradient(135deg, #4caf50, #81c784, #4caf50); - background-size: 200% 200%; - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; - margin-bottom: 10px; - animation: titleGradient 4s ease-in-out infinite; -} - -@keyframes titleGradient { - 0%, 100% { background-position: 0% 50%; } - 50% { background-position: 100% 50%; } -} - -.header p { - font-size: 1.1rem; - color: #66bb6a; - opacity: 0.9; -} - -/* 主要内容区域 */ -.main { - flex: 1; - display: grid; - grid-template-columns: 1fr 1fr; - gap: 40px; - align-items: start; -} - -/* 表单容器 */ -.form-container { - background: rgba(255, 255, 255, 0.95); - backdrop-filter: blur(20px); - padding: 35px; - border-radius: 20px; - box-shadow: 0 8px 32px rgba(76, 175, 80, 0.1); - border: 1px solid rgba(76, 175, 80, 0.2); - transition: all 0.3s ease; -} - -.form-container:hover { - transform: translateY(-5px); - box-shadow: 0 12px 40px rgba(76, 175, 80, 0.15); -} - -/* 表单样式 */ -.qr-form { - display: flex; - flex-direction: column; - gap: 25px; -} - -.input-group { - display: flex; - flex-direction: column; - gap: 8px; -} - -.input-group label { - font-weight: 600; - color: #2d5a3d; - font-size: 0.95rem; -} - -textarea, select { - padding: 12px 16px; - border: 2px solid rgba(76, 175, 80, 0.3); - border-radius: 12px; - font-size: 1rem; - background: rgba(255, 255, 255, 0.9); - transition: all 0.3s ease; - resize: vertical; -} - -textarea { - min-height: 100px; - font-family: inherit; -} - -textarea:focus, select:focus { - outline: none; - border-color: #4caf50; - box-shadow: 0 0 0 3px rgba(76, 175, 80, 0.1); - background: rgba(255, 255, 255, 1); -} - -.options-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); - gap: 20px; -} - -/* 按钮样式 */ -.generate-btn { - padding: 15px 30px; - background: linear-gradient(135deg, #4caf50, #66bb6a); - color: white; - border: none; - border-radius: 12px; - font-size: 1.1rem; - font-weight: 600; - cursor: pointer; - transition: all 0.3s ease; - position: relative; - overflow: hidden; - letter-spacing: 0.5px; -} - -.generate-btn::before { - content: ''; - position: absolute; - top: 0; - left: -100%; - width: 100%; - height: 100%; - background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent); - transition: left 0.5s ease; -} - -.generate-btn:hover::before { - left: 100%; -} - -.generate-btn:hover { - transform: translateY(-2px); - box-shadow: 0 8px 25px rgba(76, 175, 80, 0.3); -} - -.generate-btn:active { - transform: translateY(0); -} - -.generate-btn.loading .btn-text { - display: none; -} - -.generate-btn.loading .btn-loading { - display: inline; -} - -.btn-loading { - display: none; -} - -/* 结果容器 */ -.result-container { - background: rgba(255, 255, 255, 0.95); - backdrop-filter: blur(20px); - padding: 35px; - border-radius: 20px; - box-shadow: 0 8px 32px rgba(76, 175, 80, 0.1); - border: 1px solid rgba(76, 175, 80, 0.2); - min-height: 400px; - display: flex; - align-items: center; - justify-content: center; - transition: all 0.3s ease; -} - -/* 加载动画 */ -.loading { - text-align: center; - color: #4caf50; -} - -.loading-spinner { - width: 50px; - height: 50px; - border: 4px solid rgba(76, 175, 80, 0.2); - border-top: 4px solid #4caf50; - border-radius: 50%; - animation: spin 1s linear infinite; - margin: 0 auto 20px; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -/* 错误样式 */ -.error { - text-align: center; - color: #d32f2f; -} - -.error-icon { - font-size: 3rem; - margin-bottom: 15px; -} - -.error-message { - font-size: 1.1rem; - margin-bottom: 20px; - color: #666; -} - -.retry-btn { - padding: 10px 20px; - background: #4caf50; - color: white; - border: none; - border-radius: 8px; - cursor: pointer; - transition: all 0.3s ease; -} - -.retry-btn:hover { - background: #45a049; - transform: translateY(-1px); -} - -/* 结果显示 */ -.result { - width: 100%; - text-align: center; -} - -.qr-display { - margin-bottom: 25px; -} - -.qr-display img { - max-width: 100%; - height: auto; - border-radius: 12px; - box-shadow: 0 4px 20px rgba(76, 175, 80, 0.2); - transition: all 0.3s ease; -} - -.qr-display img:hover { - transform: scale(1.05); - box-shadow: 0 8px 30px rgba(76, 175, 80, 0.3); -} - -.result-info { - display: flex; - flex-direction: column; - gap: 20px; -} - -.result-text { - font-size: 1rem; - color: #666; - word-break: break-all; - background: rgba(76, 175, 80, 0.1); - padding: 12px; - border-radius: 8px; - border-left: 4px solid #4caf50; -} - -.result-actions { - display: flex; - gap: 10px; - justify-content: center; - flex-wrap: wrap; -} - -.download-btn, .copy-btn, .new-btn { - padding: 10px 16px; - border: none; - border-radius: 8px; - cursor: pointer; - font-size: 0.9rem; - font-weight: 500; - transition: all 0.3s ease; -} - -.download-btn { - background: #4caf50; - color: white; -} - -.copy-btn { - background: #2196f3; - color: white; -} - -.new-btn { - background: #ff9800; - color: white; -} - -.download-btn:hover, .copy-btn:hover, .new-btn:hover { - transform: translateY(-1px); - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2); -} - -/* 隐藏类 */ -.hidden { - display: none !important; -} - -/* 页脚样式 */ -.footer { - text-align: center; - margin-top: 40px; - padding: 25px; - background: rgba(255, 255, 255, 0.9); - backdrop-filter: blur(15px); - border-radius: 15px; - color: #66bb6a; - font-size: 0.9rem; - border: 1px solid rgba(76, 175, 80, 0.1); -} - -/* 平板端适配 (768px - 1024px) */ -@media (max-width: 1024px) and (min-width: 768px) { - .container { - max-width: 95%; - padding: 15px; - } - - .main { - gap: 30px; - } - - .header h1 { - font-size: 2.2rem; - } - - .form-container, .result-container { - padding: 25px; - } - - .options-grid { - grid-template-columns: repeat(2, 1fr); - } -} - -/* 手机端适配 (最大768px) */ -@media (max-width: 768px) { - .container { - padding: 10px; - } - - .header { - margin-bottom: 25px; - padding: 25px 15px; - } - - .header h1 { - font-size: 1.8rem; - } - - .header p { - font-size: 1rem; - } - - .main { - grid-template-columns: 1fr; - gap: 25px; - } - - .form-container, .result-container { - padding: 20px; - } - - .options-grid { - grid-template-columns: 1fr; - gap: 15px; - } - - .result-actions { - flex-direction: column; - align-items: center; - } - - .download-btn, .copy-btn, .new-btn { - width: 100%; - max-width: 200px; - } -} - -/* 小屏手机适配 (最大480px) */ -@media (max-width: 480px) { - .container { - padding: 8px; - } - - .header { - padding: 20px 10px; - margin-bottom: 20px; - } - - .header h1 { - font-size: 1.6rem; - } - - .form-container, .result-container { - padding: 15px; - border-radius: 15px; - } - - .generate-btn { - padding: 12px 20px; - font-size: 1rem; - } - - textarea { - min-height: 80px; - } - - .qr-display img { - max-width: 90%; - } -} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/实用功能/生成二维码/index.html b/frontend/react-app/public/60sapi/实用功能/生成二维码/index.html deleted file mode 100644 index f9366891..00000000 --- a/frontend/react-app/public/60sapi/实用功能/生成二维码/index.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - 二维码生成器 - - - - -
    -
    -

    🔗 二维码生成器

    -

    快速生成高质量二维码

    -
    - -
    -
    -
    -
    - - -
    - -
    -
    - - -
    - -
    - - -
    - -
    - - -
    -
    - - -
    -
    - -
    - - - - - -
    -
    - -
    -

    © 2024 二维码生成器 - 简单快捷的二维码生成工具

    -
    -
    - - - - \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/实用功能/生成二维码/js/script.js b/frontend/react-app/public/60sapi/实用功能/生成二维码/js/script.js deleted file mode 100644 index f09ff5a6..00000000 --- a/frontend/react-app/public/60sapi/实用功能/生成二维码/js/script.js +++ /dev/null @@ -1,417 +0,0 @@ -// 二维码生成器 JavaScript -class QRCodeGenerator { - constructor() { - this.apiEndpoints = []; - this.currentApiIndex = 0; - this.init(); - } - - // 初始化 - async init() { - await this.loadApiEndpoints(); - this.bindEvents(); - this.setupFormValidation(); - } - - // 加载API接口列表 - async loadApiEndpoints() { - try { - const response = await fetch('./接口集合.json'); - this.apiEndpoints = await response.json(); - console.log('已加载API接口:', this.apiEndpoints); - } catch (error) { - console.error('加载API接口失败:', error); - this.showError('加载配置失败,请刷新页面重试'); - } - } - - // 绑定事件 - bindEvents() { - const form = document.getElementById('qrForm'); - const retryBtn = document.querySelector('.retry-btn'); - const downloadBtn = document.querySelector('.download-btn'); - const copyBtn = document.querySelector('.copy-btn'); - const newBtn = document.querySelector('.new-btn'); - - form.addEventListener('submit', (e) => this.handleSubmit(e)); - retryBtn.addEventListener('click', () => this.retryGeneration()); - downloadBtn.addEventListener('click', () => this.downloadQRCode()); - copyBtn.addEventListener('click', () => this.copyImageLink()); - newBtn.addEventListener('click', () => this.resetForm()); - - // 实时字符计数 - const textArea = document.getElementById('text'); - textArea.addEventListener('input', () => this.updateCharCount()); - } - - // 设置表单验证 - setupFormValidation() { - const textArea = document.getElementById('text'); - const form = document.getElementById('qrForm'); - - textArea.addEventListener('blur', () => { - if (textArea.value.trim() === '') { - this.showFieldError(textArea, '请输入要生成二维码的内容'); - } else { - this.clearFieldError(textArea); - } - }); - } - - // 显示字段错误 - showFieldError(field, message) { - this.clearFieldError(field); - field.style.borderColor = '#d32f2f'; - const errorDiv = document.createElement('div'); - errorDiv.className = 'field-error'; - errorDiv.style.color = '#d32f2f'; - errorDiv.style.fontSize = '0.8rem'; - errorDiv.style.marginTop = '5px'; - errorDiv.textContent = message; - field.parentNode.appendChild(errorDiv); - } - - // 清除字段错误 - clearFieldError(field) { - field.style.borderColor = ''; - const errorDiv = field.parentNode.querySelector('.field-error'); - if (errorDiv) { - errorDiv.remove(); - } - } - - // 更新字符计数 - updateCharCount() { - const textArea = document.getElementById('text'); - const text = textArea.value; - const length = text.length; - - // 移除旧的计数显示 - const oldCounter = textArea.parentNode.querySelector('.char-counter'); - if (oldCounter) oldCounter.remove(); - - // 添加新的计数显示 - if (length > 0) { - const counter = document.createElement('div'); - counter.className = 'char-counter'; - counter.style.fontSize = '0.8rem'; - counter.style.color = '#666'; - counter.style.textAlign = 'right'; - counter.style.marginTop = '5px'; - counter.textContent = `${length} 个字符`; - textArea.parentNode.appendChild(counter); - } - } - - // 处理表单提交 - async handleSubmit(e) { - e.preventDefault(); - - const formData = new FormData(e.target); - const params = { - text: formData.get('text').trim(), - size: formData.get('size'), - level: formData.get('level'), - encoding: formData.get('encoding') - }; - - // 验证输入 - if (!params.text) { - this.showFieldError(document.getElementById('text'), '请输入要生成二维码的内容'); - return; - } - - this.showLoading(); - await this.generateQRCode(params); - } - - // 生成二维码 - async generateQRCode(params) { - let success = false; - let lastError = null; - - // 尝试所有API接口 - for (let i = 0; i < this.apiEndpoints.length; i++) { - const apiIndex = (this.currentApiIndex + i) % this.apiEndpoints.length; - const apiUrl = this.apiEndpoints[apiIndex]; - - try { - console.log(`尝试API ${apiIndex + 1}:`, apiUrl); - const result = await this.callAPI(apiUrl, params); - - if (result.success) { - this.currentApiIndex = apiIndex; // 记录成功的API - this.showResult(result.data, params); - success = true; - break; - } - } catch (error) { - console.warn(`API ${apiIndex + 1} 失败:`, error); - lastError = error; - } - } - - if (!success) { - this.showError(lastError?.message || '所有API接口都无法访问,请稍后重试'); - } - } - - // 调用API - async callAPI(baseUrl, params) { - const url = new URL('/v2/qrcode', baseUrl); - - // 添加查询参数 - Object.entries(params).forEach(([key, value]) => { - if (value) { - url.searchParams.append(key, value); - } - }); - - console.log('请求URL:', url.toString()); - - const controller = new AbortController(); - const timeoutId = setTimeout(() => controller.abort(), 10000); // 10秒超时 - - try { - const response = await fetch(url.toString(), { - method: 'GET', - signal: controller.signal, - headers: { - 'Accept': 'application/json, image/*' - } - }); - - clearTimeout(timeoutId); - - if (!response.ok) { - throw new Error(`HTTP ${response.status}: ${response.statusText}`); - } - - // 根据返回格式处理 - if (params.encoding === 'image') { - const blob = await response.blob(); - const imageUrl = URL.createObjectURL(blob); - return { - success: true, - data: { - imageUrl: imageUrl, - text: params.text, - size: params.size, - level: params.level, - format: 'image' - } - }; - } else { - const jsonData = await response.json(); - if (jsonData.code === 0 && jsonData.data) { - return { - success: true, - data: { - imageUrl: jsonData.data.data_uri, - text: params.text, - size: params.size, - level: params.level, - format: 'json', - base64: jsonData.data.base64, - mimeType: jsonData.data.mime_type - } - }; - } else { - throw new Error(jsonData.message || '生成失败'); - } - } - } catch (error) { - clearTimeout(timeoutId); - if (error.name === 'AbortError') { - throw new Error('请求超时,请重试'); - } - throw error; - } - } - - // 显示加载状态 - showLoading() { - this.hideAllStates(); - document.getElementById('loading').classList.remove('hidden'); - - const btn = document.querySelector('.generate-btn'); - btn.classList.add('loading'); - btn.disabled = true; - } - - // 显示错误 - showError(message) { - this.hideAllStates(); - const errorDiv = document.getElementById('error'); - const errorMessage = errorDiv.querySelector('.error-message'); - errorMessage.textContent = message; - errorDiv.classList.remove('hidden'); - - this.resetButton(); - } - - // 显示结果 - showResult(data, params) { - this.hideAllStates(); - - const resultDiv = document.getElementById('result'); - const qrImage = document.getElementById('qrImage'); - const resultText = document.querySelector('.result-text'); - - qrImage.src = data.imageUrl; - qrImage.alt = `二维码: ${data.text}`; - - resultText.innerHTML = ` - 内容: ${this.escapeHtml(data.text)}
    - 尺寸: ${data.size}x${data.size}
    - 容错级别: ${data.level}
    - 格式: ${data.format.toUpperCase()} - `; - - resultDiv.classList.remove('hidden'); - this.resetButton(); - - // 保存数据供下载使用 - this.currentQRData = data; - } - - // 隐藏所有状态 - hideAllStates() { - document.getElementById('loading').classList.add('hidden'); - document.getElementById('error').classList.add('hidden'); - document.getElementById('result').classList.add('hidden'); - } - - // 重置按钮状态 - resetButton() { - const btn = document.querySelector('.generate-btn'); - btn.classList.remove('loading'); - btn.disabled = false; - } - - // 重试生成 - async retryGeneration() { - const form = document.getElementById('qrForm'); - const formData = new FormData(form); - const params = { - text: formData.get('text').trim(), - size: formData.get('size'), - level: formData.get('level'), - encoding: formData.get('encoding') - }; - - this.showLoading(); - await this.generateQRCode(params); - } - - // 下载二维码 - downloadQRCode() { - if (!this.currentQRData) return; - - const link = document.createElement('a'); - link.href = this.currentQRData.imageUrl; - link.download = `qrcode_${Date.now()}.png`; - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - - this.showToast('二维码已下载'); - } - - // 复制图片链接 - async copyImageLink() { - if (!this.currentQRData) return; - - try { - await navigator.clipboard.writeText(this.currentQRData.imageUrl); - this.showToast('链接已复制到剪贴板'); - } catch (error) { - console.error('复制失败:', error); - this.showToast('复制失败,请手动复制'); - } - } - - // 重置表单 - resetForm() { - document.getElementById('qrForm').reset(); - this.hideAllStates(); - this.currentQRData = null; - - // 清除字符计数 - const counter = document.querySelector('.char-counter'); - if (counter) counter.remove(); - - // 清除字段错误 - document.querySelectorAll('input, textarea, select').forEach(field => { - this.clearFieldError(field); - }); - - // 聚焦到文本框 - document.getElementById('text').focus(); - } - - // 显示提示消息 - showToast(message) { - // 移除旧的toast - const oldToast = document.querySelector('.toast'); - if (oldToast) oldToast.remove(); - - const toast = document.createElement('div'); - toast.className = 'toast'; - toast.style.cssText = ` - position: fixed; - top: 20px; - right: 20px; - background: #4caf50; - color: white; - padding: 12px 20px; - border-radius: 8px; - box-shadow: 0 4px 12px rgba(0,0,0,0.2); - z-index: 1000; - animation: slideIn 0.3s ease; - `; - toast.textContent = message; - - document.body.appendChild(toast); - - setTimeout(() => { - toast.style.animation = 'slideOut 0.3s ease'; - setTimeout(() => toast.remove(), 300); - }, 3000); - } - - // HTML转义 - escapeHtml(text) { - const div = document.createElement('div'); - div.textContent = text; - return div.innerHTML; - } -} - -// 添加CSS动画 -const style = document.createElement('style'); -style.textContent = ` - @keyframes slideIn { - from { transform: translateX(100%); opacity: 0; } - to { transform: translateX(0); opacity: 1; } - } - @keyframes slideOut { - from { transform: translateX(0); opacity: 1; } - to { transform: translateX(100%); opacity: 0; } - } -`; -document.head.appendChild(style); - -// 页面加载完成后初始化 -document.addEventListener('DOMContentLoaded', () => { - new QRCodeGenerator(); -}); - -// 错误处理 -window.addEventListener('error', (e) => { - console.error('全局错误:', e.error); -}); - -window.addEventListener('unhandledrejection', (e) => { - console.error('未处理的Promise拒绝:', e.reason); -}); \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/实用功能/生成二维码/接口集合.json b/frontend/react-app/public/60sapi/实用功能/生成二维码/接口集合.json deleted file mode 100644 index 04e92b7f..00000000 --- a/frontend/react-app/public/60sapi/实用功能/生成二维码/接口集合.json +++ /dev/null @@ -1,7 +0,0 @@ -[ - "https://60s-cf.viki.moe", - "https://60s.viki.moe", - "https://60s.b23.run", - "https://60s.114128.xyz", - "https://60s-cf.114128.xyz" -] diff --git a/frontend/react-app/public/60sapi/实用功能/生成二维码/返回接口.json b/frontend/react-app/public/60sapi/实用功能/生成二维码/返回接口.json deleted file mode 100644 index 8cea87e9..00000000 --- a/frontend/react-app/public/60sapi/实用功能/生成二维码/返回接口.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "code": 0, - "message": "success", - "data": { - "base64": "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAACAASURBVHic7Z15fBTV...", - "data_uri": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAACAASURBVHic7Z15fBTV...", - "mime_type": "image/png", - "text": "https://example.com" - } -} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/实用功能/百度百科词条/css/background.css b/frontend/react-app/public/60sapi/实用功能/百度百科词条/css/background.css deleted file mode 100644 index 04fcd858..00000000 --- a/frontend/react-app/public/60sapi/实用功能/百度百科词条/css/background.css +++ /dev/null @@ -1,192 +0,0 @@ -/* 彩虹渐变背景样式 */ - -/* 主背景渐变 */ -body { - background: linear-gradient( - 135deg, - rgba(255, 107, 107, 0.3) 0%, - rgba(255, 165, 0, 0.3) 14.28%, - rgba(255, 255, 0, 0.25) 28.56%, - rgba(50, 205, 50, 0.3) 42.84%, - rgba(0, 191, 255, 0.3) 57.12%, - rgba(65, 105, 225, 0.3) 71.4%, - rgba(147, 112, 219, 0.3) 85.68%, - rgba(255, 105, 180, 0.3) 100% - ); - background-size: 400% 400%; - animation: rainbowShift 20s ease infinite; - min-height: 100vh; -} - -/* 彩虹渐变动画 */ -@keyframes rainbowShift { - 0% { - background-position: 0% 50%; - } - 50% { - background-position: 100% 50%; - } - 100% { - background-position: 0% 50%; - } -} - -/* 半透明覆盖层,增强可读性 */ -body::before { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: rgba(255, 255, 255, 0.4); - backdrop-filter: blur(2px); - z-index: -1; - pointer-events: none; -} - -/* 搜索按钮彩虹渐变 */ -.search-btn { - background: linear-gradient( - 45deg, - rgba(255, 107, 107, 0.8), - rgba(255, 165, 0, 0.8), - rgba(255, 255, 0, 0.7), - rgba(50, 205, 50, 0.8), - rgba(0, 191, 255, 0.8), - rgba(65, 105, 225, 0.8), - rgba(147, 112, 219, 0.8) - ); - background-size: 300% 300%; - animation: buttonRainbow 12s ease infinite; -} - -@keyframes buttonRainbow { - 0%, 100% { - background-position: 0% 50%; - } - 50% { - background-position: 100% 50%; - } -} - -/* 结果卡片边框彩虹渐变 */ -.result-card { - position: relative; - overflow: hidden; -} - -.result-card::before { - content: ''; - position: absolute; - top: -2px; - left: -2px; - right: -2px; - bottom: -2px; - background: linear-gradient( - 45deg, - rgba(255, 107, 107, 0.4), - rgba(255, 165, 0, 0.4), - rgba(255, 255, 0, 0.3), - rgba(50, 205, 50, 0.4), - rgba(0, 191, 255, 0.4), - rgba(65, 105, 225, 0.4), - rgba(147, 112, 219, 0.4), - rgba(255, 107, 107, 0.4) - ); - background-size: 400% 400%; - animation: borderRainbow 15s linear infinite; - border-radius: inherit; - z-index: -1; -} - -@keyframes borderRainbow { - 0% { - background-position: 0% 50%; - } - 100% { - background-position: 400% 50%; - } -} - -/* 加载动画彩虹效果 */ -.loading-spinner { - border: 4px solid rgba(255, 255, 255, 0.3); - border-top: 4px solid transparent; - border-image: linear-gradient( - 45deg, - #ff6b6b, - #ffa500, - #ffff00, - #32cd32, - #00bfff, - #4169e1, - #9370db - ) 1; - animation: spin 1s linear infinite, colorShift 3s ease infinite; -} - -@keyframes colorShift { - 0%, 100% { - filter: hue-rotate(0deg); - } - 50% { - filter: hue-rotate(180deg); - } -} - -/* 链接悬停彩虹效果 */ -.result-link:hover { - background: linear-gradient( - 90deg, - rgba(255, 107, 107, 0.7), - rgba(255, 165, 0, 0.7), - rgba(255, 255, 0, 0.6), - rgba(50, 205, 50, 0.7), - rgba(0, 191, 255, 0.7), - rgba(65, 105, 225, 0.7), - rgba(147, 112, 219, 0.7) - ); - background-size: 200% 200%; - animation: linkRainbow 3s ease infinite; - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; -} - -@keyframes linkRainbow { - 0%, 100% { - background-position: 0% 50%; - } - 50% { - background-position: 100% 50%; - } -} - -/* 标题彩虹文字效果 */ -.title { - background: linear-gradient( - 90deg, - rgba(255, 107, 107, 0.8), - rgba(255, 165, 0, 0.8), - rgba(255, 255, 0, 0.7), - rgba(50, 205, 50, 0.8), - rgba(0, 191, 255, 0.8), - rgba(65, 105, 225, 0.8), - rgba(147, 112, 219, 0.8) - ); - background-size: 200% 200%; - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; - animation: titleRainbow 8s ease infinite; -} - -@keyframes titleRainbow { - 0%, 100% { - background-position: 0% 50%; - } - 50% { - background-position: 100% 50%; - } -} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/实用功能/百度百科词条/css/style.css b/frontend/react-app/public/60sapi/实用功能/百度百科词条/css/style.css deleted file mode 100644 index 8de2ae2c..00000000 --- a/frontend/react-app/public/60sapi/实用功能/百度百科词条/css/style.css +++ /dev/null @@ -1,530 +0,0 @@ -/* 基础样式重置 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: 'Microsoft YaHei', 'PingFang SC', 'Helvetica Neue', Arial, sans-serif; - line-height: 1.6; - color: #333; - overflow-x: hidden; -} - -/* 容器布局 */ -.container { - max-width: 1200px; - margin: 0 auto; - padding: 20px; - min-height: 100vh; - display: flex; - flex-direction: column; -} - -/* 头部样式 */ -.header { - text-align: center; - margin-bottom: 40px; - padding: 20px 0; -} - -.title { - font-size: 2.5rem; - font-weight: 700; - margin-bottom: 10px; - text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.1); -} - -.subtitle { - font-size: 1.1rem; - color: rgba(255, 255, 255, 0.9); - font-weight: 300; - text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.2); -} - -/* 主内容区域 */ -.main { - flex: 1; - display: flex; - flex-direction: column; - gap: 30px; -} - -/* 搜索区域 */ -.search-section { - display: flex; - justify-content: center; - align-items: center; -} - -.search-container { - display: flex; - width: 100%; - max-width: 600px; - background: rgba(255, 255, 255, 0.95); - border-radius: 50px; - padding: 8px; - box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2); - backdrop-filter: blur(10px); - transition: all 0.3s ease; -} - -.search-container:focus-within { - transform: translateY(-2px); - box-shadow: 0 15px 40px rgba(0, 0, 0, 0.3); -} - -.search-input { - flex: 1; - border: none; - outline: none; - padding: 15px 25px; - font-size: 1.1rem; - background: transparent; - color: #333; - border-radius: 50px; -} - -.search-input::placeholder { - color: #999; - font-weight: 300; -} - -.search-btn { - border: none; - outline: none; - padding: 15px 25px; - border-radius: 50px; - color: white; - font-size: 1rem; - font-weight: 600; - cursor: pointer; - display: flex; - align-items: center; - gap: 8px; - transition: all 0.3s ease; - min-width: 120px; - justify-content: center; -} - -.search-btn:hover { - transform: scale(1.05); - box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3); -} - -.search-btn:active { - transform: scale(0.98); -} - -.search-icon { - font-size: 1.2rem; -} - -/* 结果区域 */ -.result-section { - flex: 1; - display: flex; - justify-content: center; - align-items: flex-start; - min-height: 400px; -} - -/* 加载动画 */ -.loading { - display: flex; - flex-direction: column; - align-items: center; - gap: 20px; - padding: 40px; - color: rgba(255, 255, 255, 0.9); -} - -.loading-spinner { - width: 50px; - height: 50px; - border-radius: 50%; - animation: spin 1s linear infinite; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -/* 结果卡片 */ -.result-card { - width: 100%; - max-width: 800px; - background: rgba(255, 255, 255, 0.95); - border-radius: 20px; - padding: 30px; - box-shadow: 0 15px 40px rgba(0, 0, 0, 0.2); - backdrop-filter: blur(10px); - animation: slideUp 0.5s ease; -} - -@keyframes slideUp { - from { - opacity: 0; - transform: translateY(30px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -.result-header { - margin-bottom: 25px; - text-align: center; -} - -.result-title { - font-size: 2rem; - font-weight: 700; - color: #333; - margin-bottom: 10px; -} - -.result-description { - font-size: 1.1rem; - color: #666; - font-weight: 400; -} - -.result-content { - display: grid; - grid-template-columns: 1fr 2fr; - gap: 30px; - align-items: start; -} - -.result-image-container { - display: flex; - justify-content: center; -} - -.result-image { - width: 100%; - max-width: 250px; - height: auto; - border-radius: 15px; - box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15); - transition: transform 0.3s ease; -} - -.result-image:hover { - transform: scale(1.05); -} - -.result-text { - display: flex; - flex-direction: column; - gap: 20px; -} - -.result-abstract h3 { - font-size: 1.3rem; - color: #333; - margin-bottom: 10px; - font-weight: 600; -} - -.result-abstract p { - font-size: 1rem; - line-height: 1.8; - color: #555; - text-align: justify; -} - -.result-actions { - display: flex; - justify-content: flex-end; -} - -.result-link { - display: inline-flex; - align-items: center; - gap: 8px; - padding: 12px 24px; - background: rgba(0, 123, 255, 0.1); - color: #007bff; - text-decoration: none; - border-radius: 25px; - font-weight: 600; - transition: all 0.3s ease; - border: 2px solid transparent; -} - -.result-link:hover { - background: rgba(0, 123, 255, 0.2); - transform: translateY(-2px); - box-shadow: 0 5px 15px rgba(0, 123, 255, 0.3); -} - -.link-icon { - font-size: 1.2rem; - transition: transform 0.3s ease; -} - -.result-link:hover .link-icon { - transform: translateX(5px); -} - -/* 错误消息 */ -.error-message { - display: flex; - flex-direction: column; - align-items: center; - gap: 20px; - padding: 40px; - background: rgba(255, 255, 255, 0.95); - border-radius: 20px; - box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2); - backdrop-filter: blur(10px); - text-align: center; - max-width: 500px; - width: 100%; -} - -.error-icon { - font-size: 3rem; -} - -.error-message h3 { - color: #e74c3c; - font-size: 1.5rem; - margin-bottom: 10px; -} - -.error-message p { - color: #666; - font-size: 1rem; - line-height: 1.6; -} - -.retry-btn { - padding: 12px 24px; - background: #e74c3c; - color: white; - border: none; - border-radius: 25px; - font-size: 1rem; - font-weight: 600; - cursor: pointer; - transition: all 0.3s ease; -} - -.retry-btn:hover { - background: #c0392b; - transform: translateY(-2px); - box-shadow: 0 5px 15px rgba(231, 76, 60, 0.3); -} - -/* 欢迎消息 */ -.welcome-message { - display: flex; - flex-direction: column; - align-items: center; - gap: 20px; - padding: 60px 40px; - background: rgba(255, 255, 255, 0.9); - border-radius: 20px; - box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1); - backdrop-filter: blur(10px); - text-align: center; - max-width: 600px; - width: 100%; -} - -.welcome-icon { - font-size: 4rem; - opacity: 0.8; -} - -.welcome-message h3 { - color: #333; - font-size: 1.8rem; - font-weight: 600; - margin-bottom: 10px; -} - -.welcome-message p { - color: #666; - font-size: 1.1rem; - line-height: 1.6; - max-width: 400px; -} - -/* 页脚 */ -.footer { - text-align: center; - padding: 20px 0; - margin-top: 40px; - color: rgba(255, 255, 255, 0.8); - font-size: 0.9rem; -} - -/* 平板端适配 (768px - 1024px) */ -@media (max-width: 1024px) and (min-width: 768px) { - .container { - padding: 15px; - } - - .title { - font-size: 2.2rem; - } - - .result-content { - grid-template-columns: 1fr 1.5fr; - gap: 25px; - } - - .result-card { - padding: 25px; - } -} - -/* 手机端适配 (最大768px) */ -@media (max-width: 768px) { - .container { - padding: 10px; - } - - .header { - margin-bottom: 30px; - padding: 15px 0; - } - - .title { - font-size: 1.8rem; - } - - .subtitle { - font-size: 1rem; - } - - .search-container { - max-width: 100%; - padding: 6px; - } - - .search-input { - padding: 12px 20px; - font-size: 1rem; - } - - .search-btn { - padding: 12px 20px; - min-width: 100px; - font-size: 0.9rem; - } - - .search-text { - display: none; - } - - .result-card { - padding: 20px; - border-radius: 15px; - } - - .result-title { - font-size: 1.5rem; - } - - .result-description { - font-size: 1rem; - } - - .result-content { - grid-template-columns: 1fr; - gap: 20px; - } - - .result-image { - max-width: 200px; - } - - .result-abstract h3 { - font-size: 1.2rem; - } - - .result-abstract p { - font-size: 0.95rem; - line-height: 1.7; - } - - .result-actions { - justify-content: center; - } - - .welcome-message { - padding: 40px 20px; - } - - .welcome-icon { - font-size: 3rem; - } - - .welcome-message h3 { - font-size: 1.5rem; - } - - .welcome-message p { - font-size: 1rem; - } - - .error-message { - padding: 30px 20px; - } - - .error-icon { - font-size: 2.5rem; - } - - .error-message h3 { - font-size: 1.3rem; - } -} - -/* 小屏手机适配 (最大480px) */ -@media (max-width: 480px) { - .title { - font-size: 1.6rem; - } - - .search-container { - flex-direction: column; - gap: 10px; - padding: 15px; - border-radius: 20px; - } - - .search-input { - border-radius: 15px; - text-align: center; - } - - .search-btn { - border-radius: 15px; - justify-content: center; - } - - .search-text { - display: inline; - } - - .result-card { - padding: 15px; - } - - .result-title { - font-size: 1.3rem; - } - - .result-image { - max-width: 150px; - } -} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/实用功能/百度百科词条/index.html b/frontend/react-app/public/60sapi/实用功能/百度百科词条/index.html deleted file mode 100644 index 6b52b446..00000000 --- a/frontend/react-app/public/60sapi/实用功能/百度百科词条/index.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - 百度百科词条查询 - - - - -
    -
    -

    百度百科词条查询

    -

    探索知识的彩虹世界

    -
    - -
    -
    -
    - - -
    -
    - -
    - - - - - - -
    -
    📚
    -

    欢迎使用百度百科词条查询

    -

    在上方搜索框中输入您想了解的词条,开始探索知识的海洋

    -
    -
    -
    - -
    -

    数据来源:百度百科

    -
    -
    - - - - \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/实用功能/百度百科词条/js/script.js b/frontend/react-app/public/60sapi/实用功能/百度百科词条/js/script.js deleted file mode 100644 index 6dbc4939..00000000 --- a/frontend/react-app/public/60sapi/实用功能/百度百科词条/js/script.js +++ /dev/null @@ -1,324 +0,0 @@ -// 百度百科词条查询应用 -class BaikeApp { - constructor() { - // API接口列表 - this.apiEndpoints = [ - 'https://60s-cf.viki.moe', - 'https://60s.viki.moe', - 'https://60s.b23.run', - 'https://60s.114128.xyz', - 'https://60s-cf.114128.xyz' - ]; - - this.currentApiIndex = 0; - this.isLoading = false; - - this.initElements(); - this.bindEvents(); - } - - // 初始化DOM元素 - initElements() { - this.searchInput = document.getElementById('searchInput'); - this.searchBtn = document.getElementById('searchBtn'); - this.resultSection = document.getElementById('resultSection'); - this.loading = document.getElementById('loading'); - this.resultCard = document.getElementById('resultCard'); - this.errorMessage = document.getElementById('errorMessage'); - this.welcomeMessage = document.getElementById('welcomeMessage'); - this.retryBtn = document.getElementById('retryBtn'); - - // 结果显示元素 - this.resultTitle = document.getElementById('resultTitle'); - this.resultDescription = document.getElementById('resultDescription'); - this.resultImage = document.getElementById('resultImage'); - this.resultAbstract = document.getElementById('resultAbstract'); - this.resultLink = document.getElementById('resultLink'); - this.errorText = document.getElementById('errorText'); - } - - // 绑定事件 - bindEvents() { - // 搜索按钮点击事件 - this.searchBtn.addEventListener('click', () => { - this.handleSearch(); - }); - - // 输入框回车事件 - this.searchInput.addEventListener('keypress', (e) => { - if (e.key === 'Enter') { - this.handleSearch(); - } - }); - - // 重试按钮事件 - this.retryBtn.addEventListener('click', () => { - this.handleSearch(); - }); - - // 输入框焦点事件 - this.searchInput.addEventListener('focus', () => { - this.searchInput.select(); - }); - } - - // 处理搜索 - async handleSearch() { - const query = this.searchInput.value.trim(); - - if (!query) { - this.showError('请输入要查询的词条'); - this.searchInput.focus(); - return; - } - - if (this.isLoading) { - return; - } - - await this.searchBaike(query); - } - - // 搜索百科词条 - async searchBaike(query) { - this.showLoading(); - this.isLoading = true; - - // 重置API索引 - this.currentApiIndex = 0; - - const success = await this.tryApiCall(query); - - if (!success) { - this.showError('所有API接口都无法访问,请稍后重试'); - } - - this.isLoading = false; - } - - // 尝试API调用 - async tryApiCall(query) { - for (let i = 0; i < this.apiEndpoints.length; i++) { - const endpoint = this.apiEndpoints[this.currentApiIndex]; - - try { - const result = await this.callApi(endpoint, query); - if (result) { - this.showResult(result); - return true; - } - } catch (error) { - console.warn(`API ${endpoint} 调用失败:`, error.message); - } - - // 切换到下一个API - this.currentApiIndex = (this.currentApiIndex + 1) % this.apiEndpoints.length; - } - - return false; - } - - // 调用API - async callApi(endpoint, query) { - const url = `${endpoint}/v2/baike?word=${encodeURIComponent(query)}`; - - const controller = new AbortController(); - const timeoutId = setTimeout(() => controller.abort(), 10000); // 10秒超时 - - try { - const response = await fetch(url, { - method: 'GET', - signal: controller.signal, - headers: { - 'Accept': 'application/json', - } - }); - - clearTimeout(timeoutId); - - if (!response.ok) { - throw new Error(`HTTP ${response.status}: ${response.statusText}`); - } - - const data = await response.json(); - - if (data.code === 200 && data.data) { - return data.data; - } else { - throw new Error(data.message || '未找到相关词条'); - } - - } catch (error) { - clearTimeout(timeoutId); - - if (error.name === 'AbortError') { - throw new Error('请求超时'); - } - - throw error; - } - } - - // 显示加载状态 - showLoading() { - this.hideAllSections(); - this.loading.style.display = 'flex'; - } - - // 显示搜索结果 - showResult(data) { - this.hideAllSections(); - - // 填充数据 - this.resultTitle.textContent = data.title || '未知标题'; - this.resultDescription.textContent = data.description || '暂无描述'; - this.resultAbstract.textContent = data.abstract || '暂无摘要信息'; - - // 处理图片 - if (data.cover) { - this.resultImage.src = data.cover; - this.resultImage.style.display = 'block'; - this.resultImage.onerror = () => { - this.resultImage.style.display = 'none'; - }; - } else { - this.resultImage.style.display = 'none'; - } - - // 处理链接 - if (data.link) { - this.resultLink.href = data.link; - this.resultLink.style.display = 'inline-flex'; - } else { - this.resultLink.style.display = 'none'; - } - - this.resultCard.style.display = 'block'; - - // 滚动到结果区域 - this.resultCard.scrollIntoView({ - behavior: 'smooth', - block: 'start' - }); - } - - // 显示错误信息 - showError(message) { - this.hideAllSections(); - this.errorText.textContent = message; - this.errorMessage.style.display = 'flex'; - } - - // 隐藏所有区域 - hideAllSections() { - this.loading.style.display = 'none'; - this.resultCard.style.display = 'none'; - this.errorMessage.style.display = 'none'; - this.welcomeMessage.style.display = 'none'; - } - - // 显示欢迎信息 - showWelcome() { - this.hideAllSections(); - this.welcomeMessage.style.display = 'flex'; - } -} - -// 工具函数 -class Utils { - // 防抖函数 - static debounce(func, wait) { - let timeout; - return function executedFunction(...args) { - const later = () => { - clearTimeout(timeout); - func(...args); - }; - clearTimeout(timeout); - timeout = setTimeout(later, wait); - }; - } - - // 节流函数 - static throttle(func, limit) { - let inThrottle; - return function() { - const args = arguments; - const context = this; - if (!inThrottle) { - func.apply(context, args); - inThrottle = true; - setTimeout(() => inThrottle = false, limit); - } - }; - } - - // 格式化文本长度 - static truncateText(text, maxLength) { - if (text.length <= maxLength) { - return text; - } - return text.substring(0, maxLength) + '...'; - } - - // 检查是否为移动设备 - static isMobile() { - return window.innerWidth <= 768; - } -} - -// 页面加载完成后初始化应用 -document.addEventListener('DOMContentLoaded', () => { - // 初始化应用 - const app = new BaikeApp(); - - // 添加页面可见性变化监听 - document.addEventListener('visibilitychange', () => { - if (document.visibilityState === 'visible') { - // 页面重新可见时,聚焦搜索框 - if (!app.isLoading) { - app.searchInput.focus(); - } - } - }); - - // 添加窗口大小变化监听 - window.addEventListener('resize', Utils.throttle(() => { - // 响应式调整 - if (Utils.isMobile()) { - // 移动端特殊处理 - document.body.classList.add('mobile'); - } else { - document.body.classList.remove('mobile'); - } - }, 250)); - - // 初始检查设备类型 - if (Utils.isMobile()) { - document.body.classList.add('mobile'); - } - - // 页面加载完成后聚焦搜索框 - setTimeout(() => { - app.searchInput.focus(); - }, 500); - - // 添加键盘快捷键支持 - document.addEventListener('keydown', (e) => { - // Ctrl/Cmd + K 聚焦搜索框 - if ((e.ctrlKey || e.metaKey) && e.key === 'k') { - e.preventDefault(); - app.searchInput.focus(); - app.searchInput.select(); - } - - // ESC 清空搜索框 - if (e.key === 'Escape') { - app.searchInput.value = ''; - app.showWelcome(); - app.searchInput.focus(); - } - }); - - console.log('百度百科词条查询应用已初始化'); -}); \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/实用功能/百度百科词条/接口集合.json b/frontend/react-app/public/60sapi/实用功能/百度百科词条/接口集合.json deleted file mode 100644 index 04e92b7f..00000000 --- a/frontend/react-app/public/60sapi/实用功能/百度百科词条/接口集合.json +++ /dev/null @@ -1,7 +0,0 @@ -[ - "https://60s-cf.viki.moe", - "https://60s.viki.moe", - "https://60s.b23.run", - "https://60s.114128.xyz", - "https://60s-cf.114128.xyz" -] diff --git a/frontend/react-app/public/60sapi/实用功能/百度百科词条/返回接口.json b/frontend/react-app/public/60sapi/实用功能/百度百科词条/返回接口.json deleted file mode 100644 index 55ec21dc..00000000 --- a/frontend/react-app/public/60sapi/实用功能/百度百科词条/返回接口.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": { - "title": "西游记", - "description": "明代吴承恩创作的章回体长篇神魔小说", - "abstract": "《西游记》又名《西游释厄传》,是中国古代第一部浪漫主义章回体长篇神魔小说。最早的《西游记》版本是明代万历二十年金陵世德堂《新刻出像官板大字西游记》,未署作者姓名。鲁迅、董作宾等人根据《淮安府志》“吴承恩《西游记》”的记载予以最终论定“吴承恩原著”。该小说主要讲述了孙悟空出世,并寻菩提祖师学艺及大闹天宫后,与猪八戒、沙僧和白龙马一同护送唐僧西天取经,于路上历经险阻,降妖除魔,渡过了九九八十一难,成功...", - "cover": "https://bkimg.cdn.bcebos.com/pic/b7fd5266d01609248d763e43db0735fae6cd3412?x-bce-process=image/format,f_auto", - "has_other": true, - "link": "http://baike.baidu.com/subview/2583/5315045.htm" - } -} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/日更资讯/历史上的今天/css/style.css b/frontend/react-app/public/60sapi/日更资讯/历史上的今天/css/style.css deleted file mode 100644 index 93fb1485..00000000 --- a/frontend/react-app/public/60sapi/日更资讯/历史上的今天/css/style.css +++ /dev/null @@ -1,388 +0,0 @@ -/* 历史上的今天 - 手机端优先的响应式设计 */ - -/* 重置样式 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; - background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); - min-height: 100vh; - color: #2c3e50; - line-height: 1.6; - overflow-x: hidden; -} - -.container { - max-width: 100%; - margin: 0 auto; - padding: 10px; -} - -/* 头部样式 - 手机端优先 */ -.header { - text-align: center; - margin-bottom: 20px; - background: rgba(255, 255, 255, 0.95); - border-radius: 15px; - padding: 20px 15px; - box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1); - backdrop-filter: blur(10px); -} - -.header h1 { - font-size: 1.8rem; - color: #2c3e50; - margin-bottom: 8px; - font-weight: 700; - display: flex; - align-items: center; - justify-content: center; - gap: 10px; - flex-wrap: wrap; -} - -.header p { - color: #7f8c8d; - font-size: 0.9rem; - line-height: 1.4; -} - -/* 日期显示 */ -.date-info { - background: rgba(255, 255, 255, 0.95); - border-radius: 12px; - padding: 15px; - margin-bottom: 15px; - text-align: center; - box-shadow: 0 3px 15px rgba(0, 0, 0, 0.08); -} - -.date-info h2 { - font-size: 1.3rem; - color: #2c3e50; - margin-bottom: 5px; -} - -.date-info .date-text { - color: #7f8c8d; - font-size: 0.9rem; -} - -/* 加载状态 */ -.loading { - text-align: center; - padding: 30px 15px; - background: rgba(255, 255, 255, 0.95); - border-radius: 12px; - box-shadow: 0 3px 15px rgba(0, 0, 0, 0.08); -} - -.spinner { - width: 35px; - height: 35px; - border: 3px solid #ecf0f1; - border-top: 3px solid #667eea; - border-radius: 50%; - animation: spin 1s linear infinite; - margin: 0 auto 15px; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -/* 历史事件容器 */ -.events-container { - background: rgba(255, 255, 255, 0.95); - border-radius: 15px; - padding: 15px; - margin-bottom: 15px; - box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08); - backdrop-filter: blur(10px); -} - -/* 统计信息 */ -.stats { - display: grid; - grid-template-columns: repeat(4, 1fr); - gap: 8px; - margin-bottom: 20px; -} - -.stat-item { - background: rgba(102, 126, 234, 0.1); - border-radius: 10px; - padding: 12px; - text-align: center; -} - -.stat-number { - font-size: 1.4rem; - font-weight: 700; - color: #667eea; - display: block; -} - -.stat-label { - color: #7f8c8d; - font-size: 0.8rem; - margin-top: 3px; -} - -/* 事件列表 */ -.events-list { - display: flex; - flex-direction: column; - gap: 12px; -} - -.event-card { - background: rgba(255, 255, 255, 0.9); - border-radius: 12px; - padding: 15px; - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05); - transition: all 0.3s ease; - border-left: 4px solid #667eea; - position: relative; -} - -.event-card:hover { - transform: translateY(-2px); - box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1); -} - -/* 事件类型标签 */ -.event-type { - position: absolute; - top: 10px; - right: 10px; - padding: 4px 8px; - border-radius: 12px; - font-size: 0.7rem; - font-weight: 600; - text-transform: uppercase; -} - -.event-type.birth { - background: #e8f5e8; - color: #27ae60; -} - -.event-type.death { - background: #fdf2e9; - color: #e67e22; -} - -.event-type.event { - background: #ebf3fd; - color: #3498db; -} - -/* 事件年份 */ -.event-year { - font-size: 1.1rem; - font-weight: 700; - color: #667eea; - margin-bottom: 8px; - display: flex; - align-items: center; - gap: 8px; -} - -.event-year::before { - content: "📅"; - font-size: 1rem; -} - -/* 事件标题 */ -.event-title { - font-size: 1rem; - font-weight: 600; - color: #2c3e50; - margin-bottom: 8px; - line-height: 1.4; -} - -/* 事件描述 */ -.event-description { - color: #7f8c8d; - font-size: 0.85rem; - line-height: 1.5; - margin-bottom: 10px; -} - -/* 链接按钮 */ -.event-link { - display: inline-flex; - align-items: center; - gap: 5px; - color: #667eea; - text-decoration: none; - font-size: 0.8rem; - font-weight: 500; - padding: 6px 12px; - background: rgba(102, 126, 234, 0.1); - border-radius: 15px; - transition: all 0.3s ease; -} - -.event-link:hover { - background: rgba(102, 126, 234, 0.2); - transform: translateX(2px); -} - -.event-link::after { - content: "🔗"; - font-size: 0.7rem; -} - -/* 错误提示 */ -.error { - background: #fed7d7; - color: #c53030; - padding: 15px; - border-radius: 12px; - text-align: center; - border: 1px solid #feb2b2; - margin: 15px 0; - font-size: 0.9rem; -} - -/* 隐藏类 */ -.hidden { - display: none; -} - -/* 淡入动画 */ -.fade-in { - animation: fadeIn 0.6s ease-in; -} - -@keyframes fadeIn { - from { - opacity: 0; - transform: translateY(20px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -/* 平板端适配 (768px+) */ -@media (min-width: 768px) { - .container { - max-width: 750px; - padding: 20px; - } - - .header { - padding: 30px 25px; - } - - .header h1 { - font-size: 2.2rem; - } - - .header p { - font-size: 1rem; - } - - .date-info { - padding: 20px; - } - - .date-info h2 { - font-size: 1.5rem; - } - - .events-container { - padding: 25px; - } - - .stats { - gap: 15px; - } - - .event-card { - padding: 20px; - } - - .event-title { - font-size: 1.1rem; - } - - .event-description { - font-size: 0.9rem; - } -} - -/* 电脑端适配 (1024px+) */ -@media (min-width: 1024px) { - .container { - max-width: 1000px; - padding: 30px; - } - - .header { - padding: 40px 35px; - } - - .header h1 { - font-size: 2.5rem; - } - - .events-list { - display: grid; - grid-template-columns: repeat(2, 1fr); - gap: 20px; - } - - .event-card { - padding: 25px; - } - - .event-title { - font-size: 1.2rem; - } - - .event-description { - font-size: 0.95rem; - } -} - -/* 大屏幕优化 (1200px+) */ -@media (min-width: 1200px) { - .container { - max-width: 1200px; - padding: 40px; - } - - .events-list { - grid-template-columns: repeat(3, 1fr); - gap: 25px; - } -} - -/* 滚动条样式 */ -::-webkit-scrollbar { - width: 6px; -} - -::-webkit-scrollbar-track { - background: rgba(255, 255, 255, 0.1); -} - -::-webkit-scrollbar-thumb { - background: rgba(102, 126, 234, 0.5); - border-radius: 3px; -} - -::-webkit-scrollbar-thumb:hover { - background: rgba(102, 126, 234, 0.7); -} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/日更资讯/历史上的今天/index.html b/frontend/react-app/public/60sapi/日更资讯/历史上的今天/index.html deleted file mode 100644 index 2f941a44..00000000 --- a/frontend/react-app/public/60sapi/日更资讯/历史上的今天/index.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - 历史上的今天 - 60s API集合 - - - - - - - - - - - - - -
    - -
    -

    📚 历史上的今天

    -

    探索历史,了解今天在历史上发生的重要事件

    -
    - - -
    -
    - 加载中... -
    -
    - - -
    -
    -

    正在加载历史数据...

    -
    - - -
    - - - -
    -

    历史事件

    -
    -
    - -
    -
    -
    -
    - -
    - - - - - - - - \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/日更资讯/历史上的今天/js/script.js b/frontend/react-app/public/60sapi/日更资讯/历史上的今天/js/script.js deleted file mode 100644 index 986eac74..00000000 --- a/frontend/react-app/public/60sapi/日更资讯/历史上的今天/js/script.js +++ /dev/null @@ -1,295 +0,0 @@ -// 历史上的今天 - JavaScript 功能实现 - -// API 配置 -const API = { - endpoints: [], - currentIndex: 0, - encoding: 'utf-8', - // 初始化API接口列表 - async init() { - try { - const res = await fetch('./接口集合.json'); - const endpoints = await res.json(); - this.endpoints = endpoints.map(endpoint => `${endpoint}/v2/today_in_history`); - } catch (e) { - // 如果无法加载接口集合,使用默认接口 - this.endpoints = ['https://60s.viki.moe/v2/today_in_history']; - } - }, - // 获取当前接口URL - getCurrentUrl() { - if (this.endpoints.length === 0) return null; - const url = new URL(this.endpoints[this.currentIndex]); - url.searchParams.append('encoding', this.encoding); - return url.toString(); - }, - // 切换到下一个接口 - switchToNext() { - this.currentIndex = (this.currentIndex + 1) % this.endpoints.length; - return this.currentIndex < this.endpoints.length; - }, - // 重置到第一个接口 - reset() { - this.currentIndex = 0; - } -}; - -// 事件类型映射 -const EVENT_TYPE_MAP = { - 'birth': { name: '诞生', icon: '🎂', color: '#27ae60' }, - 'death': { name: '逝世', icon: '🕊️', color: '#e67e22' }, - 'event': { name: '事件', icon: '📰', color: '#3498db' } -}; - -// DOM 元素 -let elements = {}; -let currentData = null; - -// 页面加载完成后初始化 -document.addEventListener('DOMContentLoaded', function() { - initElements(); - loadTodayInHistory(); -}); - -// 初始化 DOM 元素 -function initElements() { - elements = { - loading: document.getElementById('loading'), - content: document.getElementById('history-content'), - dateInfo: document.getElementById('date-info'), - dateText: document.getElementById('date-text'), - totalEvents: document.getElementById('total-events'), - birthEvents: document.getElementById('birth-events'), - deathEvents: document.getElementById('death-events'), - otherEvents: document.getElementById('other-events'), - eventsList: document.getElementById('events-list') - }; -} - -// 加载历史上的今天数据 -async function loadTodayInHistory() { - try { - showLoading(true); - - // 初始化API接口列表 - await API.init(); - - // 重置API索引到第一个接口 - API.reset(); - - // 尝试所有API接口 - for (let i = 0; i < API.endpoints.length; i++) { - try { - const url = API.getCurrentUrl(); - console.log(`尝试接口 ${i + 1}/${API.endpoints.length}: ${url}`); - - const response = await fetch(url, { - cache: 'no-store', - timeout: 10000 // 10秒超时 - }); - - if (!response.ok) { - throw new Error(`HTTP ${response.status}: ${response.statusText}`); - } - - const data = await response.json(); - console.log('API响应数据:', data); - - if (data.code === 200 && data.data) { - console.log(`接口 ${i + 1} 请求成功`); - currentData = data.data; - displayHistoryData(data.data); - return; - } else { - throw new Error(data.message || '获取数据失败'); - } - - } catch (error) { - console.warn(`接口 ${i + 1} 失败:`, error.message); - - // 如果不是最后一个接口,切换到下一个 - if (i < API.endpoints.length - 1) { - API.switchToNext(); - continue; - } - - // 所有接口都失败了,抛出错误 - throw new Error('所有接口都无法访问'); - } - } - - } catch (error) { - console.error('加载历史数据失败:', error); - showError(`加载失败: ${error.message}`); - } finally { - showLoading(false); - } -} - -// 显示历史数据 -function displayHistoryData(data) { - if (!data || !data.items) { - showError('没有获取到历史数据'); - return; - } - - // 更新日期信息 - updateDateInfo(data); - - // 更新统计信息 - updateStats(data.items); - - // 显示事件列表 - renderEventsList(data.items); - - // 显示内容区域 - if (elements.content) { - elements.content.classList.add('fade-in'); - elements.content.style.display = 'block'; - } -} - -// 更新日期信息 -function updateDateInfo(data) { - if (elements.dateText && data.date) { - const today = new Date(); - const year = today.getFullYear(); - elements.dateText.textContent = `${year}年${data.month}月${data.day}日`; - } -} - -// 更新统计信息 -function updateStats(items) { - const stats = { - total: items.length, - birth: items.filter(item => item.event_type === 'birth').length, - death: items.filter(item => item.event_type === 'death').length, - event: items.filter(item => item.event_type === 'event').length - }; - - if (elements.totalEvents) { - elements.totalEvents.textContent = stats.total; - } - - if (elements.birthEvents) { - elements.birthEvents.textContent = stats.birth; - } - - if (elements.deathEvents) { - elements.deathEvents.textContent = stats.death; - } - - if (elements.otherEvents) { - elements.otherEvents.textContent = stats.event; - } -} - -// 渲染事件列表 -function renderEventsList(items) { - if (!elements.eventsList || !items) return; - - // 按年份排序(从今到古) - const sortedItems = [...items].sort((a, b) => { - return parseInt(b.year) - parseInt(a.year); - }); - - elements.eventsList.innerHTML = ''; - - sortedItems.forEach(item => { - const eventCard = createEventCard(item); - elements.eventsList.appendChild(eventCard); - }); -} - -// 创建事件卡片 -function createEventCard(item) { - const card = document.createElement('div'); - card.className = 'event-card'; - - const eventType = EVENT_TYPE_MAP[item.event_type] || EVENT_TYPE_MAP['event']; - - card.innerHTML = ` -
    ${eventType.name}
    -
    ${formatYear(item.year)}
    -
    ${escapeHtml(item.title)}
    -
    ${escapeHtml(item.description)}
    - ${item.link ? `了解更多` : ''} - `; - - return card; -} - -// 格式化年份显示 -function formatYear(year) { - const yearNum = parseInt(year); - if (yearNum < 0) { - return `公元前${Math.abs(yearNum)}年`; - } else if (yearNum < 1000) { - return `公元${yearNum}年`; - } else { - return `${yearNum}年`; - } -} - -// 显示加载状态 -function showLoading(show) { - if (elements.loading) { - elements.loading.style.display = show ? 'block' : 'none'; - } - - if (elements.content) { - elements.content.style.display = show ? 'none' : 'block'; - } -} - -// 显示错误信息 -function showError(message) { - if (elements.content) { - elements.content.innerHTML = ` -
    -

    😔 加载失败

    -

    ${escapeHtml(message)}

    - -
    - `; - elements.content.style.display = 'block'; - } -} - -// HTML 转义 -function escapeHtml(text) { - const div = document.createElement('div'); - div.textContent = text; - return div.innerHTML; -} - -// 错误处理 -window.addEventListener('error', function(event) { - console.error('页面错误:', event.error); -}); - -// 网络状态监听 -window.addEventListener('online', function() { - console.log('网络已连接'); -}); - -window.addEventListener('offline', function() { - console.log('网络已断开'); - showError('网络连接已断开,请检查网络设置'); -}); - -// 导出全局方法 -window.TodayInHistory = { - loadTodayInHistory, - showError, - showLoading -}; \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/日更资讯/历史上的今天/接口集合.json b/frontend/react-app/public/60sapi/日更资讯/历史上的今天/接口集合.json deleted file mode 100644 index 04e92b7f..00000000 --- a/frontend/react-app/public/60sapi/日更资讯/历史上的今天/接口集合.json +++ /dev/null @@ -1,7 +0,0 @@ -[ - "https://60s-cf.viki.moe", - "https://60s.viki.moe", - "https://60s.b23.run", - "https://60s.114128.xyz", - "https://60s-cf.114128.xyz" -] diff --git a/frontend/react-app/public/60sapi/日更资讯/历史上的今天/返回接口.json b/frontend/react-app/public/60sapi/日更资讯/历史上的今天/返回接口.json deleted file mode 100644 index 8531e735..00000000 --- a/frontend/react-app/public/60sapi/日更资讯/历史上的今天/返回接口.json +++ /dev/null @@ -1,102 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": { - "date": "8-19", - "month": 8, - "day": 19, - "items": [ - { - "title": "罗马帝国开国皇帝奥古斯都逝世", - "year": "14", - "description": "奥古斯都(拉丁文 Augustus的中译,复数型 Augusti)的原意为“神圣的”、“高贵的”,带有宗教与神学式的意味。", - "event_type": "death", - "link": "https://baike.baidu.com/item/%E5%A5%A5%E5%8F%A4%E6%96%AF%E9%83%BD/14291" - }, - { - "title": "近代概率论的奠基者帕斯卡逝世", - "year": "1662", - "description": "布莱士·帕斯卡(Blaise Pascal ,1623-1662)是法国数学家、物理学家、哲学家、散文家。", - "event_type": "death", - "link": "https://baike.baidu.com/item/%E5%B8%83%E8%8E%B1%E5%A3%AB%C2%B7%E5%B8%95%E6%96%AF%E5%8D%A1" - }, - { - "title": "瑞典国王古斯塔夫三世发动政变夺取权力", - "year": "1772", - "description": "古斯塔夫三世(Gustavus III,1746-1792)是瑞典历史上褒贬最多的国王(1771-1792)。阿道夫·弗里德里克国王的儿子和继承者。", - "event_type": "event", - "link": "https://baike.baidu.com/item/%E5%8F%A4%E6%96%AF%E5%A1%94%E5%A4%AB%E4%B8%89%E4%B8%96" - }, - { - "title": "美国飞机设计师奥维尔·莱特诞生", - "year": "1871", - "description": "奥威尔莱特(公元1871~公元1948)。 奥维尔·莱特1871年生于美国俄亥俄州代顿市。上过中学,但实际上未获得毕业文凭。", - "event_type": "birth", - "link": "https://baike.baidu.com/item/%E5%A5%A5%E7%BB%B4%E5%B0%94%C2%B7%E8%8E%B1%E7%89%B9" - }, - { - "title": "法国著名时装设计师、香奈儿品牌创始人加布里埃·香奈儿出生", - "year": "1883", - "description": "香奈儿儿时入读修女院学校学得一手针线活。后来她与许多上流社会男士有过交往。1910年,毅然放弃嫁入豪门做阔太太的她在巴黎开设了一家女装帽子店,从此开创了香奈儿时尚帝国。", - "event_type": "birth", - "link": "https://baike.baidu.com/item/%E5%8A%A0%E5%B8%83%E9%87%8C%E5%9F%83%C2%B7%E9%A6%99%E5%A5%88%E5%84%BF/9480318" - }, - { - "title": "美国宇航员斯托里·马斯格雷夫出生", - "year": "1935", - "description": "斯托里·马斯格雷夫(Franklin Story Musgrave,1935年8月19日-),美国宇航员,拥有医学、数学、文学等六个学位,入选美国国家航空航天局(NASA)科学家宇航员。", - "event_type": "birth", - "link": "https://baike.baidu.com/item/%E6%96%AF%E6%89%98%E9%87%8C%C2%B7%E9%A9%AC%E6%96%AF%E6%A0%BC%E9%9B%B7%E5%A4%AB" - }, - { - "title": "纳粹德国陆军元帅京特·冯·克鲁格畏罪自杀", - "year": "1944", - "description": "汉斯·京特·冯·克卢格(Günther·von·Kluge, 1882年10月30日-1944年8月19日),纳粹德国陆军元帅(1940.7.19),著名军事家、统帅。", - "event_type": "death", - "link": "https://baike.baidu.com/item/%E4%BA%AC%E7%89%B9%C2%B7%E5%86%AF%C2%B7%E5%85%8B%E9%B2%81%E6%A0%BC" - }, - { - "title": "美国第42任总统克林顿出生", - "year": "1946", - "description": "威廉·杰斐逊·克林顿,美国律师、政治家,美国民主党成员,曾任阿肯色州州长和第42任美国总统。克林顿基金会主席 。", - "event_type": "birth", - "link": "https://baike.baidu.com/item/%E5%A8%81%E5%BB%89%C2%B7%E6%9D%B0%E6%96%90%E9%80%8A%C2%B7%E5%85%8B%E6%9E%97%E9%A1%BF" - }, - { - "title": "美国演员马修·派瑞出生", - "year": "1969", - "description": "马修·派瑞(Matthew Perry,1969年8月19日—2023年10月28日),出生于美国马萨诸塞州普利茅斯,美国、加拿大籍男演员、编剧。", - "event_type": "birth", - "link": "https://baike.baidu.com/item/%E9%A9%AC%E4%BF%AE%C2%B7%E6%B4%BE%E7%91%9E" - }, - { - "title": "北回归线标志塔在广州落成", - "year": "1985", - "description": "北回归线标志塔,是标志地理学上北回归线经过地方的建筑物。", - "event_type": "event", - "link": "https://baike.baidu.com/item/%E5%8C%97%E5%9B%9E%E5%BD%92%E7%BA%BF%E6%A0%87%E5%BF%97%E5%A1%94" - }, - { - "title": "“八一九事件”,苏联八月政变", - "year": "1991", - "description": "八一九事件,又称“苏联政变”、“八月政变”,指1991年8月19日-8月21日在苏联发生的一次政变。", - "event_type": "event", - "link": "https://baike.baidu.com/item/%E5%85%AB%E4%B8%80%E4%B9%9D%E4%BA%8B%E4%BB%B6" - }, - { - "title": "量子化学家莱纳斯·卡尔·鲍林逝世", - "year": "1994", - "description": "莱纳斯·卡尔·鲍林(Linus Carl Pauling,1901年2月28日—1994年8月19日),出生于美国俄勒冈州波特兰,化学家、美国国家科学院院士、美国艺术与科学院院士,1954年诺贝尔化学奖获得者。", - "event_type": "death", - "link": "https://baike.baidu.com/item/%E8%8E%B1%E7%BA%B3%E6%96%AF%C2%B7%E5%8D%A1%E5%B0%94%C2%B7%E9%B2%8D%E6%9E%97" - }, - { - "title": "中国三江源自然保护区成立", - "year": "2000", - "description": "青海三江源国家级自然保护区位于青藏高原腹地,青海省南部,地理位置介于东经89°24′~102°23′,北纬31°39′~36°16′之间,青海三江源国家级自然保护区属湿地类型的自然保护区。", - "event_type": "event", - "link": "https://baike.baidu.com/item/%E4%B8%89%E6%B1%9F%E6%BA%90%E8%87%AA%E7%84%B6%E4%BF%9D%E6%8A%A4%E5%8C%BA" - } - ] - } -} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/日更资讯/必应每日壁纸/css/style.css b/frontend/react-app/public/60sapi/日更资讯/必应每日壁纸/css/style.css deleted file mode 100644 index ac8ca0e5..00000000 --- a/frontend/react-app/public/60sapi/日更资讯/必应每日壁纸/css/style.css +++ /dev/null @@ -1,326 +0,0 @@ -/* 必应每日壁纸 - 淡绿色清新风格样式 */ - -/* 重置样式 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; - background: linear-gradient(135deg, #a8e6cf 0%, #dcedc1 50%, #ffd3a5 100%); - min-height: 100vh; - color: #2d5016; - line-height: 1.6; - overflow-x: hidden; -} - -.container { - max-width: 1200px; - margin: 0 auto; - padding: 20px; -} - -/* 头部样式 */ -.header { - text-align: center; - margin-bottom: 30px; - background: rgba(255, 255, 255, 0.85); - border-radius: 20px; - padding: 30px; - box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08); - backdrop-filter: blur(10px); -} - -.header h1 { - font-size: 2.5rem; - color: #2d5016; - margin-bottom: 10px; - font-weight: 700; - display: flex; - align-items: center; - justify-content: center; - gap: 15px; -} - -.header p { - color: #5a7c65; - font-size: 1.1rem; -} - -/* 加载状态 */ -.loading { - text-align: center; - padding: 40px; - background: rgba(255, 255, 255, 0.85); - border-radius: 15px; - box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08); -} - -.spinner { - width: 40px; - height: 40px; - border: 4px solid #e8f5e8; - border-top: 4px solid #81c784; - border-radius: 50%; - animation: spin 1s linear infinite; - margin: 0 auto 20px; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -/* 壁纸容器 */ -.wallpaper-container { - background: rgba(255, 255, 255, 0.85); - border-radius: 20px; - padding: 30px; - box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08); - backdrop-filter: blur(10px); - margin-bottom: 20px; -} - -/* 壁纸信息 */ -.wallpaper-info { - text-align: center; - margin-bottom: 25px; -} - -.wallpaper-title { - font-size: 1.8rem; - font-weight: 700; - color: #2d5016; - margin-bottom: 10px; -} - -.wallpaper-date { - color: #5a7c65; - font-size: 1rem; - margin-bottom: 15px; -} - -.wallpaper-description { - color: #2d5016; - font-size: 1.1rem; - line-height: 1.6; - max-width: 800px; - margin: 0 auto; -} - -/* 壁纸图片 */ -.wallpaper-image { - position: relative; - border-radius: 15px; - overflow: hidden; - box-shadow: 0 10px 30px rgba(45, 80, 22, 0.15); - margin: 20px 0; -} - -.wallpaper-image img { - width: 100%; - height: auto; - display: block; - transition: transform 0.3s ease; -} - -.wallpaper-image:hover img { - transform: scale(1.02); -} - -/* 下载按钮 */ -.download-section { - text-align: center; - margin-top: 25px; -} - -.download-btn { - background: linear-gradient(135deg, #81c784 0%, #66bb6a 100%); - color: white; - border: none; - padding: 15px 30px; - border-radius: 25px; - font-size: 1.1rem; - font-weight: 600; - cursor: pointer; - transition: all 0.3s ease; - box-shadow: 0 4px 15px rgba(129, 199, 132, 0.3); - text-decoration: none; - display: inline-flex; - align-items: center; - gap: 10px; -} - -.download-btn:hover { - transform: translateY(-2px); - box-shadow: 0 6px 20px rgba(129, 199, 132, 0.4); -} - -.download-btn:active { - transform: translateY(0); -} - -/* 错误提示 */ -.error { - background: #fed7d7; - color: #c53030; - padding: 20px; - border-radius: 15px; - text-align: center; - border: 1px solid #feb2b2; - margin: 20px 0; -} - -/* 版权信息 */ -.copyright { - background: rgba(255, 255, 255, 0.7); - border-radius: 15px; - padding: 20px; - text-align: center; - color: #5a7c65; - font-size: 0.9rem; - margin-top: 20px; -} - -/* 响应式设计 */ - -/* 平板端 */ -@media (max-width: 768px) { - .container { - padding: 15px; - } - - .header h1 { - font-size: 2rem; - flex-direction: column; - gap: 10px; - } - - .header { - padding: 20px; - } - - .wallpaper-container { - padding: 20px; - } - - .wallpaper-title { - font-size: 1.5rem; - } - - .wallpaper-description { - font-size: 1rem; - } -} - -/* 手机端 */ -@media (max-width: 480px) { - .container { - padding: 10px; - } - - .header { - padding: 15px; - margin-bottom: 20px; - } - - .header h1 { - font-size: 1.8rem; - } - - .wallpaper-container { - padding: 15px; - } - - .wallpaper-title { - font-size: 1.3rem; - } - - .wallpaper-description { - font-size: 0.95rem; - } - - .download-btn { - padding: 12px 25px; - font-size: 1rem; - width: 100%; - justify-content: center; - } - - .copyright { - padding: 15px; - font-size: 0.8rem; - } -} - -/* 大屏幕优化 */ -@media (min-width: 1200px) { - .container { - padding: 40px; - } - - .header { - padding: 40px; - } - - .wallpaper-container { - padding: 40px; - } - - .wallpaper-image { - max-height: 70vh; - overflow: hidden; - } - - .wallpaper-image img { - width: 100%; - height: 100%; - object-fit: cover; - } -} - -/* 特殊效果 */ -.fade-in { - animation: fadeIn 0.6s ease-in; -} - -@keyframes fadeIn { - from { - opacity: 0; - transform: translateY(20px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -/* 图片加载效果 */ -.wallpaper-image img { - opacity: 0; - transition: opacity 0.3s ease; -} - -.wallpaper-image img.loaded { - opacity: 1; -} - -/* 滚动条样式 */ -::-webkit-scrollbar { - width: 8px; -} - -::-webkit-scrollbar-track { - background: rgba(255, 255, 255, 0.1); -} - -::-webkit-scrollbar-thumb { - background: rgba(129, 199, 132, 0.5); - border-radius: 4px; -} - -::-webkit-scrollbar-thumb:hover { - background: rgba(129, 199, 132, 0.7); -} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/日更资讯/必应每日壁纸/index.html b/frontend/react-app/public/60sapi/日更资讯/必应每日壁纸/index.html deleted file mode 100644 index ac3ecb85..00000000 --- a/frontend/react-app/public/60sapi/日更资讯/必应每日壁纸/index.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - 必应每日壁纸 - - - - - - - - -
    - -
    -

    - 🖼️ - 必应每日壁纸 -

    -

    每天为您呈现精美的必应壁纸,发现世界之美

    -
    - - -
    -
    -

    正在加载今日壁纸...

    -
    - - -
    - -
    -
    - - - - - \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/日更资讯/必应每日壁纸/js/script.js b/frontend/react-app/public/60sapi/日更资讯/必应每日壁纸/js/script.js deleted file mode 100644 index 9e231288..00000000 --- a/frontend/react-app/public/60sapi/日更资讯/必应每日壁纸/js/script.js +++ /dev/null @@ -1,315 +0,0 @@ -// 必应每日壁纸 JavaScript 功能 - -// API配置 -const API = { - endpoints: [], - currentIndex: 0, - params: { - encoding: 'json' - }, - // 初始化API接口列表 - async init() { - try { - const res = await fetch('./接口集合.json'); - const endpoints = await res.json(); - this.endpoints = endpoints.map(endpoint => `${endpoint}/v2/bing`); - } catch (e) { - // 如果无法加载接口集合,使用默认接口 - this.endpoints = ['https://60s.viki.moe/v2/bing']; - } - }, - // 获取当前接口URL - getCurrentUrl() { - if (this.endpoints.length === 0) return null; - const url = new URL(this.endpoints[this.currentIndex]); - Object.keys(this.params).forEach(key => { - url.searchParams.append(key, this.params[key]); - }); - return url.toString(); - }, - // 切换到下一个接口 - switchToNext() { - this.currentIndex = (this.currentIndex + 1) % this.endpoints.length; - return this.currentIndex < this.endpoints.length; - }, - // 重置到第一个接口 - reset() { - this.currentIndex = 0; - } -}; - -// DOM元素 -let elements = {}; - -// 初始化 -document.addEventListener('DOMContentLoaded', function() { - initElements(); - loadWallpaper(); -}); - -// 初始化DOM元素 -function initElements() { - elements = { - container: document.getElementById('wallpaper-content'), - loading: document.getElementById('loading') - }; -} - -// 加载壁纸数据 -async function loadWallpaper() { - try { - showLoading(true); - - // 初始化API接口列表 - await API.init(); - - // 重置API索引到第一个接口 - API.reset(); - - // 尝试所有API接口 - for (let i = 0; i < API.endpoints.length; i++) { - try { - const url = API.getCurrentUrl(); - console.log(`尝试接口 ${i + 1}/${API.endpoints.length}: ${url}`); - - const response = await fetch(url, { - cache: 'no-store', - timeout: 10000 // 10秒超时 - }); - - if (!response.ok) { - throw new Error(`HTTP ${response.status}: ${response.statusText}`); - } - - const data = await response.json(); - console.log('API响应数据:', data); - - // 检查数据有效性 - if (data && (data.code === 200 || data.data)) { - console.log(`接口 ${i + 1} 请求成功`); - displayWallpaper(data); - return; - } - - throw new Error(data && data.message ? data.message : '接口返回异常'); - - } catch (error) { - console.warn(`接口 ${i + 1} 失败:`, error.message); - - // 如果不是最后一个接口,切换到下一个 - if (i < API.endpoints.length - 1) { - API.switchToNext(); - continue; - } - - // 所有接口都失败了,抛出错误 - throw new Error('所有接口都无法访问'); - } - } - - } catch (error) { - console.error('加载壁纸失败:', error); - showError('加载壁纸失败,请稍后重试'); - } finally { - showLoading(false); - } -} - -// 显示壁纸 -function displayWallpaper(data) { - if (!data) { - showError('没有获取到壁纸数据'); - return; - } - - // 提取壁纸信息 - const wallpaperInfo = extractWallpaperInfo(data); - - if (!wallpaperInfo || !wallpaperInfo.imageUrl) { - showError('壁纸图片链接无效'); - return; - } - - // 生成HTML内容 - const html = generateWallpaperHTML(wallpaperInfo); - - // 显示内容 - elements.container.innerHTML = html; - elements.container.classList.add('fade-in'); - - // 绑定图片加载事件 - bindImageEvents(); -} - -// 提取壁纸信息 -function extractWallpaperInfo(data) { - // 根据API响应结构提取信息 - let imageUrl = ''; - let title = '必应每日壁纸'; - let description = ''; - let date = new Date().toLocaleDateString('zh-CN'); - let copyright = ''; - - // 处理新的API响应格式 - if (data.data) { - const wallpaperData = data.data; - title = wallpaperData.title || title; - description = wallpaperData.description || wallpaperData.main_text || ''; - copyright = wallpaperData.copyright || ''; - date = wallpaperData.update_date || date; - - // 提取图片URL,去除反引号 - if (wallpaperData.cover) { - imageUrl = wallpaperData.cover.replace(/`/g, '').trim(); - } - } - // 处理其他可能的API响应格式 - else if (data.url) { - imageUrl = data.url; - } else if (data.image_url) { - imageUrl = data.image_url; - } else if (data.images && data.images.length > 0) { - imageUrl = data.images[0].url || data.images[0].image_url; - title = data.images[0].title || title; - description = data.images[0].description || data.images[0].copyright || ''; - copyright = data.images[0].copyright || ''; - } - - // 如果是相对路径,转换为完整URL - if (imageUrl && imageUrl.startsWith('/')) { - imageUrl = 'https://www.bing.com' + imageUrl; - } - - // 确保图片URL有效 - if (!imageUrl || imageUrl === '') { - console.error('无法提取图片URL,原始数据:', data); - return null; - } - - return { - imageUrl, - title, - description: description || copyright, - date, - copyright - }; -} - -// 生成壁纸HTML -function generateWallpaperHTML(info) { - return ` -
    -
    -

    ${escapeHtml(info.title)}

    -
    ${info.date}
    - ${info.description ? `
    ${escapeHtml(info.description)}
    ` : ''} -
    - -
    - ${escapeHtml(info.title)} -
    - - -
    - - ${info.copyright ? ` - - ` : ''} - `; -} - -// 绑定图片事件 -function bindImageEvents() { - const images = elements.container.querySelectorAll('img'); - - images.forEach(img => { - img.addEventListener('load', function() { - this.classList.add('loaded'); - }); - - img.addEventListener('error', function() { - console.error('图片加载失败:', this.src); - this.parentElement.innerHTML = ` -
    -

    🖼️ 图片加载失败

    -

    请检查网络连接或稍后重试

    -
    - `; - }); - }); -} - -// 显示/隐藏加载状态 -function showLoading(show) { - if (elements.loading) { - elements.loading.style.display = show ? 'block' : 'none'; - } - if (elements.container) { - elements.container.style.display = show ? 'none' : 'block'; - } -} - -// 显示错误信息 -function showError(message) { - if (elements.container) { - elements.container.innerHTML = ` -
    -

    ⚠️ 加载失败

    -

    ${escapeHtml(message)}

    -

    请检查网络连接或稍后重试

    -
    - `; - elements.container.style.display = 'block'; - } -} - -// HTML转义 -function escapeHtml(text) { - if (!text) return ''; - const div = document.createElement('div'); - div.textContent = text; - return div.innerHTML; -} - -// 格式化日期 -function formatDate(dateString) { - try { - const date = new Date(dateString); - return date.toLocaleDateString('zh-CN', { - year: 'numeric', - month: 'long', - day: 'numeric' - }); - } catch (error) { - return dateString; - } -} - -// 错误处理 -window.addEventListener('error', function(event) { - console.error('页面错误:', event.error); -}); - -// 网络状态监听 -window.addEventListener('online', function() { - console.log('网络已连接'); -}); - -window.addEventListener('offline', function() { - console.log('网络已断开'); - showError('网络连接已断开,请检查网络设置'); -}); - -// 导出函数供外部调用 -window.BingWallpaper = { - loadWallpaper, - showError, - showLoading -}; \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/日更资讯/必应每日壁纸/接口集合.json b/frontend/react-app/public/60sapi/日更资讯/必应每日壁纸/接口集合.json deleted file mode 100644 index 04e92b7f..00000000 --- a/frontend/react-app/public/60sapi/日更资讯/必应每日壁纸/接口集合.json +++ /dev/null @@ -1,7 +0,0 @@ -[ - "https://60s-cf.viki.moe", - "https://60s.viki.moe", - "https://60s.b23.run", - "https://60s.114128.xyz", - "https://60s-cf.114128.xyz" -] diff --git a/frontend/react-app/public/60sapi/日更资讯/必应每日壁纸/返回接口.json b/frontend/react-app/public/60sapi/日更资讯/必应每日壁纸/返回接口.json deleted file mode 100644 index 2c6a72a4..00000000 --- a/frontend/react-app/public/60sapi/日更资讯/必应每日壁纸/返回接口.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": { - "title": "瑟沃格湖,瓦加尔岛,法罗群岛", - "headline": "海洋上方的湖泊", - "description": "大自然自有其奇妙之处,瑟沃格湖(Sørvágsvatn)便是其中最精彩的之一。世界湖泊日是探索法罗群岛(丹麦王国的一个自治行政区)这片视错觉的绝佳时机。这座位于沃格岛上的湖泊也被称为莱蒂斯湖(Leitisvatn),看似漂浮在海平面之上。实际上,它的海拔不到100英尺。索尔瓦格斯湖是法罗群岛最大的湖泊,面积约1.3平方英里,为Bøsdalafossur瀑布Bøsdalafossur提供水源,瀑布的湖水在那里奔腾而下,最终倾泻而入大海。", - "main_text": "该湖位于瓦加尔岛南部,通过Bøsdalafossur瀑布与大西洋相连,形成了壮丽的“悬湖”景观。", - "cover": "https://bing.com/th?id=OHR.FaroeLake_ZH-CN3977660997_1920x1080.jpg", - "cover_4k": "https://bing.com/th?id=OHR.FaroeLake_ZH-CN3977660997_UHD.jpg", - "copyright": "© Anton Petrus/Getty Images", - "update_date": "2025-08-27 13:24:37", - "update_date_at": 1756301077809 - } -} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/日更资讯/每天60s读懂世界/css/style.css b/frontend/react-app/public/60sapi/日更资讯/每天60s读懂世界/css/style.css deleted file mode 100644 index 9bd66ac6..00000000 --- a/frontend/react-app/public/60sapi/日更资讯/每天60s读懂世界/css/style.css +++ /dev/null @@ -1,327 +0,0 @@ -/* 每天60s读懂世界 - 清新风格样式 */ - -/* 重置样式 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; - background: linear-gradient(135deg, #a8e6cf 0%, #dcedc1 50%, #ffd3a5 100%); - min-height: 100vh; - color: #2d5016; - line-height: 1.6; -} - -.container { - max-width: 1200px; - margin: 0 auto; - padding: 20px; -} - -/* 头部样式 */ -.header { - text-align: center; - margin-bottom: 30px; - background: rgba(255, 255, 255, 0.85); - border-radius: 20px; - padding: 30px; - box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08); - backdrop-filter: blur(10px); -} - -.header h1 { - font-size: 2.5rem; - color: #2d5016; - margin-bottom: 10px; - font-weight: 700; -} - -.header p { - color: #5a7c65; - font-size: 1.1rem; -} - -/* 控制面板 */ -.controls { - background: rgba(255, 255, 255, 0.85); - border-radius: 15px; - padding: 20px; - margin-bottom: 30px; - box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08); - backdrop-filter: blur(10px); -} - -.date-selector { - display: flex; - align-items: center; - gap: 15px; - margin-bottom: 20px; - flex-wrap: wrap; -} - -.date-selector label { - font-weight: 600; - color: #4a5568; -} - -.date-selector input { - padding: 10px 15px; - border: 2px solid #e2e8f0; - border-radius: 10px; - font-size: 1rem; - transition: all 0.3s ease; -} - -.date-selector input:focus { - outline: none; - border-color: #81c784; - box-shadow: 0 0 0 3px rgba(129, 199, 132, 0.1); -} - -.btn { - background: linear-gradient(135deg, #81c784 0%, #66bb6a 100%); - color: white; - border: none; - padding: 12px 25px; - border-radius: 10px; - font-size: 1rem; - font-weight: 600; - cursor: pointer; - transition: all 0.3s ease; - box-shadow: 0 4px 15px rgba(129, 199, 132, 0.3); -} - -.btn:hover { - transform: translateY(-2px); - box-shadow: 0 6px 20px rgba(129, 199, 132, 0.4); -} - -.btn:active { - transform: translateY(0); -} - -/* 加载状态 */ -.loading { - text-align: center; - padding: 40px; - background: rgba(255, 255, 255, 0.85); - border-radius: 15px; - box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08); -} - -.spinner { - width: 40px; - height: 40px; - border: 4px solid #e8f5e8; - border-top: 4px solid #81c784; - border-radius: 50%; - animation: spin 1s linear infinite; - margin: 0 auto 20px; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -/* 内容区域 */ -.content { - background: rgba(255, 255, 255, 0.85); - border-radius: 20px; - padding: 30px; - box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08); - backdrop-filter: blur(10px); -} - -.news-header { - display: flex; - align-items: center; - justify-content: space-between; - margin-bottom: 25px; - flex-wrap: wrap; - gap: 15px; -} - -.news-date { - font-size: 1.5rem; - font-weight: 700; - color: #2d5016; -} - -.lunar-date { - color: #5a7c65; - font-size: 1rem; -} - -/* 新闻图片 */ -.news-image { - width: 100%; - max-width: 600px; - height: auto; - border-radius: 15px; - margin: 20px auto; - display: block; - box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15); -} - -/* 新闻列表 */ -.news-list { - margin: 25px 0; -} - -.news-item { - background: #f1f8e9; - border-left: 4px solid #81c784; - padding: 15px 20px; - margin-bottom: 15px; - border-radius: 0 10px 10px 0; - transition: all 0.3s ease; - position: relative; -} - -.news-item:hover { - background: #e8f5e8; - transform: translateX(5px); - box-shadow: 0 4px 15px rgba(45, 80, 22, 0.1); -} - -.news-item::before { - content: counter(news-counter); - counter-increment: news-counter; - position: absolute; - left: -15px; - top: 50%; - transform: translateY(-50%); - background: #81c784; - color: white; - width: 25px; - height: 25px; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - font-size: 0.8rem; - font-weight: bold; -} - -.news-list { - counter-reset: news-counter; -} - -/* 每日一句 */ -.daily-tip { - background: linear-gradient(135deg, #ffecd2 0%, #fcb69f 100%); - padding: 20px; - border-radius: 15px; - margin: 25px 0; - text-align: center; - font-style: italic; - font-size: 1.1rem; - color: #744210; - box-shadow: 0 5px 20px rgba(252, 182, 159, 0.3); -} - -/* 错误提示 */ -.error { - background: #fed7d7; - color: #c53030; - padding: 20px; - border-radius: 10px; - text-align: center; - border: 1px solid #feb2b2; -} - -/* 响应式设计 */ - -/* 平板端 */ -@media (max-width: 768px) { - .container { - padding: 15px; - } - - .header h1 { - font-size: 2rem; - } - - .header { - padding: 20px; - } - - .content { - padding: 20px; - } - - .date-selector { - flex-direction: column; - align-items: stretch; - } - - .news-header { - flex-direction: column; - align-items: flex-start; - } -} - -/* 手机端 */ -@media (max-width: 480px) { - .container { - padding: 10px; - } - - .header { - padding: 15px; - margin-bottom: 20px; - } - - .header h1 { - font-size: 1.8rem; - } - - .controls { - padding: 15px; - } - - .content { - padding: 15px; - } - - .news-item { - padding: 12px 15px; - margin-left: 10px; - } - - .news-item::before { - left: -10px; - width: 20px; - height: 20px; - font-size: 0.7rem; - } - - .daily-tip { - padding: 15px; - font-size: 1rem; - } - - .btn { - width: 100%; - padding: 15px; - } -} - -/* 大屏幕优化 */ -@media (min-width: 1200px) { - .container { - padding: 40px; - } - - .header { - padding: 40px; - } - - .content { - padding: 40px; - } -} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/日更资讯/每天60s读懂世界/index.html b/frontend/react-app/public/60sapi/日更资讯/每天60s读懂世界/index.html deleted file mode 100644 index 3240ff17..00000000 --- a/frontend/react-app/public/60sapi/日更资讯/每天60s读懂世界/index.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - 每天60秒读懂世界 | 最新资讯 - - - - - - - - - - - - - -
    - -
    -

    📰 每天60秒读懂世界

    -

    获取最新资讯,了解天下大事

    -
    - - - - -
    - -
    -
    -

    正在加载今日资讯...

    -
    -
    -
    - - -
    -

    Made with ❤️ | 数据来源:每天60秒读懂世界API

    -
    - - - - - \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/日更资讯/每天60s读懂世界/js/script.js b/frontend/react-app/public/60sapi/日更资讯/每天60s读懂世界/js/script.js deleted file mode 100644 index 63c2d19f..00000000 --- a/frontend/react-app/public/60sapi/日更资讯/每天60s读懂世界/js/script.js +++ /dev/null @@ -1,305 +0,0 @@ -// 每天60s读懂世界 - JavaScript功能实现 - -const API = { - endpoints: [], - currentIndex: 0, - params: { - encoding: 'json' - }, - localFallback: '返回接口.json', - // 初始化API接口列表 - async init() { - try { - const res = await fetch('./接口集合.json'); - const endpoints = await res.json(); - this.endpoints = endpoints.map(endpoint => `${endpoint}/v2/60s`); - } catch (e) { - // 如果无法加载接口集合,使用默认接口 - this.endpoints = ['https://60s.viki.moe/v2/60s']; - } - }, - // 获取当前接口URL - getCurrentUrl() { - if (this.endpoints.length === 0) return null; - const url = new URL(this.endpoints[this.currentIndex]); - Object.entries(this.params).forEach(([k, v]) => url.searchParams.append(k, v)); - return url.toString(); - }, - // 切换到下一个接口 - switchToNext() { - this.currentIndex = (this.currentIndex + 1) % this.endpoints.length; - return this.currentIndex < this.endpoints.length; - }, - // 重置到第一个接口 - reset() { - this.currentIndex = 0; - } -}; - -class NewsApp { - constructor() { - this.apiUrl = 'https://60s.viki.moe/v2/60s'; - this.init(); - } - - init() { - this.bindEvents(); - this.loadTodayNews(); - } - - bindEvents() { - // 移除了刷新按钮,不需要绑定事件 - } - - formatDate(date) { - const year = date.getFullYear(); - const month = String(date.getMonth() + 1).padStart(2, '0'); - const day = String(date.getDate()).padStart(2, '0'); - return `${year}-${month}-${day}`; - } - - showLoading() { - const contentDiv = document.getElementById('content'); - if (contentDiv) { - contentDiv.innerHTML = ` -
    -
    -

    正在获取最新资讯...

    -
    - `; - } - } - - showError(message) { - const contentDiv = document.getElementById('content'); - if (contentDiv) { - contentDiv.innerHTML = ` -
    -

    😔 获取失败

    -

    ${message}

    -
    - `; - } - } - - async loadNews() { - try { - this.showLoading(); - - // 尝试从API获取数据 - let data = await this.fetchFromAPI(); - - // 如果API失败,尝试本地数据 - if (!data) { - data = await this.fetchFromLocal(); - } - - if (!data) { - throw new Error('无法获取数据,请检查网络连接或稍后重试'); - } - - if (data.code !== 200) { - throw new Error(data.message || '获取数据失败'); - } - - this.renderNews(data.data); - - } catch (error) { - console.error('获取新闻失败:', error); - this.showError(error.message || '网络连接失败,请检查网络后重试'); - } - } - - async fetchFromAPI() { - // 初始化API接口列表 - await API.init(); - - // 重置API索引到第一个接口 - API.reset(); - - // 尝试所有API接口 - for (let i = 0; i < API.endpoints.length; i++) { - try { - const url = API.getCurrentUrl(); - console.log(`尝试接口 ${i + 1}/${API.endpoints.length}: ${url}`); - - const resp = await fetch(url, { - cache: 'no-store' - }); - - if (!resp.ok) { - throw new Error(`HTTP ${resp.status}: ${resp.statusText}`); - } - - const data = await resp.json(); - - if (data && data.code === 200) { - console.log(`接口 ${i + 1} 请求成功`); - return data; - } - - throw new Error(data && data.message ? data.message : '接口返回异常'); - - } catch (e) { - console.warn(`接口 ${i + 1} 失败:`, e.message); - - // 如果不是最后一个接口,切换到下一个 - if (i < API.endpoints.length - 1) { - API.switchToNext(); - continue; - } - - // 所有接口都失败了 - console.warn('所有远程接口都失败,尝试本地数据'); - return null; - } - } - } - - async fetchFromLocal() { - try { - const resp = await fetch(API.localFallback + `?t=${Date.now()}`); - if (!resp.ok) throw new Error(`本地文件HTTP ${resp.status}`); - const data = await resp.json(); - return data; - } catch (e) { - console.error('读取本地返回接口.json失败:', e); - return null; - } - } - - loadTodayNews() { - this.loadNews(); - } - - renderNews(newsData) { - const contentDiv = document.getElementById('content'); - if (!contentDiv || !newsData) return; - - const { - date, - day_of_week, - lunar_date, - news, - tip, - link - } = newsData; - - let newsListHtml = ''; - if (news && news.length > 0) { - newsListHtml = news.map(item => ` -
    - ${this.escapeHtml(item)} -
    - `).join(''); - } - - // 移除图片显示功能 - - const tipHtml = tip ? ` -
    - 💡 ${this.escapeHtml(tip)} -
    - ` : ''; - - const linkHtml = link ? ` - - ` : ''; - - contentDiv.innerHTML = ` -
    -
    -
    ${this.escapeHtml(date)} ${this.escapeHtml(day_of_week || '')}
    - ${lunar_date ? `
    ${this.escapeHtml(lunar_date)}
    ` : ''} -
    -
    - - ${tipHtml} - -
    -

    📰 今日要闻

    - ${newsListHtml} -
    - - ${linkHtml} - -
    -

    数据来源:每天60秒读懂世界

    -

    更新时间:${newsData.api_updated || '未知'}

    -
    - `; - } - - escapeHtml(text) { - if (typeof text !== 'string') return text; - const div = document.createElement('div'); - div.textContent = text; - return div.innerHTML; - } -} - -// 页面加载完成后初始化应用 -document.addEventListener('DOMContentLoaded', function() { - window.newsApp = new NewsApp(); -}); - -// 添加一些实用功能 -function copyToClipboard(text) { - navigator.clipboard.writeText(text).then(() => { - showToast('已复制到剪贴板'); - }).catch(() => { - showToast('复制失败,请手动复制'); - }); -} - -function showToast(message) { - // 创建提示框 - const toast = document.createElement('div'); - toast.style.cssText = ` - position: fixed; - top: 20px; - right: 20px; - background: #4a5568; - color: white; - padding: 12px 20px; - border-radius: 8px; - z-index: 1000; - font-size: 14px; - box-shadow: 0 4px 12px rgba(0,0,0,0.3); - animation: slideIn 0.3s ease; - `; - toast.textContent = message; - - // 添加动画样式 - const style = document.createElement('style'); - style.textContent = ` - @keyframes slideIn { - from { transform: translateX(100%); opacity: 0; } - to { transform: translateX(0); opacity: 1; } - } - `; - document.head.appendChild(style); - - document.body.appendChild(toast); - - // 3秒后自动移除 - setTimeout(() => { - toast.remove(); - style.remove(); - }, 3000); -} - -// 添加键盘快捷键支持 -document.addEventListener('keydown', function(e) { - // Ctrl/Cmd + R 刷新数据 - if ((e.ctrlKey || e.metaKey) && e.key === 'r') { - e.preventDefault(); - if (window.newsApp) { - window.newsApp.loadNews(); - } - } -}); \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/日更资讯/每天60s读懂世界/接口集合.json b/frontend/react-app/public/60sapi/日更资讯/每天60s读懂世界/接口集合.json deleted file mode 100644 index 04e92b7f..00000000 --- a/frontend/react-app/public/60sapi/日更资讯/每天60s读懂世界/接口集合.json +++ /dev/null @@ -1,7 +0,0 @@ -[ - "https://60s-cf.viki.moe", - "https://60s.viki.moe", - "https://60s.b23.run", - "https://60s.114128.xyz", - "https://60s-cf.114128.xyz" -] diff --git a/frontend/react-app/public/60sapi/日更资讯/每天60s读懂世界/返回接口.json b/frontend/react-app/public/60sapi/日更资讯/每天60s读懂世界/返回接口.json deleted file mode 100644 index 7804d62a..00000000 --- a/frontend/react-app/public/60sapi/日更资讯/每天60s读懂世界/返回接口.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": [ - { - "id": "9aa227e2ba294bb1a95c95fde892eb31", - "title": "《Totally Reliable Delivery Service》 Standard Edition", - "cover": "https://cdn1.epicgames.com/52b90f9a982a404781b189f6a7903226/offer/EGS_TotallyReliableDeliveryService_WereFiveGames_S1-2560x1440-47e6e9562d62705a75ea7b7096d0b8dc.jpg", - "original_price": 52, - "original_price_desc": "¥52.00", - "description": "穿好护腰护具,发动货车,送货的时间到啦!在一个高度互动的沙盒世界中,与最多三位好友一起随意地完成送货。货物已试投,这就是我们靠谱快递(Totally Reliable Delivery Service)的品质保证!", - "seller": "Infogrames LLC", - "is_free_now": true, - "free_start": "2025/08/14 23:00:00", - "free_start_at": 1755183600000, - "free_end": "2025/08/21 23:00:00", - "free_end_at": 1755788400000, - "link": "https://store.epicgames.com/store/zh-CN/p/totally-reliable-delivery-service/home" - }, - { - "id": "8ea3500dc38e4f429702bf889c172d3d", - "title": "Hidden Folks", - "cover": "https://cdn1.epicgames.com/spt-assets/7bfd56b0586348dcb139945d9e59f988/hidden-folks-1b7hh.png", - "original_price": 47, - "original_price_desc": "¥47.00", - "description": "Search for hidden folks in hand-drawn, interactive, miniature landscapes. Unfurl tent flaps, cut through bushes, slam doors, and poke some crocodiles! Rooooaaaarrrr!!!!!", - "seller": "Adriaan de Jongh", - "is_free_now": true, - "free_start": "2025/08/14 23:00:00", - "free_start_at": 1755183600000, - "free_end": "2025/08/21 23:00:00", - "free_end_at": 1755788400000, - "link": "https://store.epicgames.com/store/zh-CN/p/hidden-folks-239d16" - }, - { - "id": "4cbb6c3704d240f19c3dd5f5cb2b0cb4", - "title": "Kamaeru", - "cover": "https://cdn1.epicgames.com/spt-assets/44313cfbb62b4df5801d0c8d541c2624/kamaeru-40asc.png", - "original_price": 62, - "original_price_desc": "¥62.00", - "description": "Foster a sanctuary for frogs and restore the biodiversity of the wetlands in Kamaeru, a cozy frog collecting game, where you take pictures of frogs, play mini-games and decorate your habitat. Hop right to it!", - "seller": "Armor Games Studios", - "is_free_now": false, - "free_start": "2025/08/21 23:00:00", - "free_start_at": 1755788400000, - "free_end": "2025/08/28 23:00:00", - "free_end_at": 1756393200000, - "link": "https://store.epicgames.com/store/zh-CN/p/kamaeru-0c301e" - }, - { - "id": "0d9a533f0e684cc18620a8f408e8e72c", - "title": "Strange Horticulture", - "cover": "https://cdn1.epicgames.com/spt-assets/15e8e3eba65a4763a815d6eae1d763b2/strange-horticulture-offer-2wghv.png", - "original_price": 45, - "original_price_desc": "¥45.00", - "description": "款神秘学解谜游戏,你将扮演当地植物商店的店主,寻找并识别新的植物,悠闲撸猫,与女巫团体交谈,或加入异教。收集各种强大的植物,用它们来影响故事走向,揭开昂德米尔镇的黑暗谜团。", - "seller": "Iceberg Interactive", - "is_free_now": false, - "free_start": "2025/08/21 23:00:00", - "free_start_at": 1755788400000, - "free_end": "2025/08/28 23:00:00", - "free_end_at": 1756393200000, - "link": "https://store.epicgames.com/store/zh-CN/p/strange-horticulture-360e80" - } - ] -} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/日更资讯/每日国际汇率/css/style.css b/frontend/react-app/public/60sapi/日更资讯/每日国际汇率/css/style.css deleted file mode 100644 index 5bb68371..00000000 --- a/frontend/react-app/public/60sapi/日更资讯/每日国际汇率/css/style.css +++ /dev/null @@ -1,409 +0,0 @@ -/* 每日国际汇率 - 淡绿色清新风格样式 */ - -/* 重置样式 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; - background: linear-gradient(135deg, #a8e6cf 0%, #dcedc1 50%, #ffd3a5 100%); - min-height: 100vh; - color: #2d5016; - line-height: 1.6; - overflow-x: hidden; -} - -.container { - max-width: 1200px; - margin: 0 auto; - padding: 20px; -} - -/* 头部样式 */ -.header { - text-align: center; - margin-bottom: 30px; - background: rgba(255, 255, 255, 0.85); - border-radius: 20px; - padding: 30px; - box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08); - backdrop-filter: blur(10px); -} - -.header h1 { - font-size: 2.5rem; - color: #2d5016; - margin-bottom: 10px; - font-weight: 700; - display: flex; - align-items: center; - justify-content: center; - gap: 15px; -} - -.header p { - color: #5a7c65; - font-size: 1.1rem; -} - -/* 货币选择器 */ -.currency-selector { - background: rgba(255, 255, 255, 0.85); - border-radius: 15px; - padding: 20px; - margin-bottom: 20px; - box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08); - text-align: center; -} - -.currency-selector label { - display: block; - margin-bottom: 10px; - font-weight: 600; - color: #2d5016; -} - -.currency-selector select { - padding: 12px 20px; - border: 2px solid #c8e6c9; - border-radius: 25px; - background: white; - color: #2d5016; - font-size: 1rem; - min-width: 200px; - cursor: pointer; - transition: all 0.3s ease; -} - -.currency-selector select:focus { - outline: none; - border-color: #81c784; - box-shadow: 0 0 0 3px rgba(129, 199, 132, 0.2); -} - -/* 加载状态 */ -.loading { - text-align: center; - padding: 40px; - background: rgba(255, 255, 255, 0.85); - border-radius: 15px; - box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08); -} - -.spinner { - width: 40px; - height: 40px; - border: 4px solid #e8f5e8; - border-top: 4px solid #81c784; - border-radius: 50%; - animation: spin 1s linear infinite; - margin: 0 auto 20px; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -/* 汇率信息容器 */ -.exchange-info { - background: rgba(255, 255, 255, 0.85); - border-radius: 20px; - padding: 25px; - margin-bottom: 20px; - box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08); - backdrop-filter: blur(10px); -} - -.base-currency { - text-align: center; - margin-bottom: 20px; -} - -.base-currency h2 { - font-size: 1.8rem; - color: #2d5016; - margin-bottom: 10px; -} - -.update-time { - color: #5a7c65; - font-size: 0.9rem; -} - -/* 汇率网格 */ -.rates-grid { - display: grid; - grid-template-columns: repeat(8, 1fr); - gap: 10px; - margin-top: 20px; -} - -.rate-card { - background: rgba(255, 255, 255, 0.9); - border-radius: 10px; - padding: 12px; - box-shadow: 0 3px 10px rgba(45, 80, 22, 0.06); - transition: all 0.3s ease; - border: 1px solid rgba(200, 230, 201, 0.5); - text-align: center; -} - -.rate-card:hover { - transform: translateY(-1px); - box-shadow: 0 4px 15px rgba(45, 80, 22, 0.1); - border-color: #81c784; -} - -.currency-code { - font-size: 1rem; - font-weight: 700; - color: #2d5016; - margin-bottom: 6px; - display: flex; - align-items: center; - justify-content: center; - gap: 6px; -} - -.currency-flag { - font-size: 1.2rem; -} - -.exchange-rate { - font-size: 1.1rem; - font-weight: 600; - color: #388e3c; - margin-bottom: 4px; -} - -.currency-name { - color: #5a7c65; - font-size: 0.8rem; - line-height: 1.2; -} - -/* 搜索框 */ -.search-container { - background: rgba(255, 255, 255, 0.85); - border-radius: 15px; - padding: 20px; - margin-bottom: 20px; - box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08); -} - -.search-input { - width: 100%; - padding: 12px 20px; - border: 2px solid #c8e6c9; - border-radius: 25px; - background: white; - color: #2d5016; - font-size: 1rem; - transition: all 0.3s ease; -} - -.search-input:focus { - outline: none; - border-color: #81c784; - box-shadow: 0 0 0 3px rgba(129, 199, 132, 0.2); -} - -.search-input::placeholder { - color: #81c784; -} - -/* 错误提示 */ -.error { - background: #fed7d7; - color: #c53030; - padding: 20px; - border-radius: 15px; - text-align: center; - border: 1px solid #feb2b2; - margin: 20px 0; -} - -/* 统计信息 */ -.stats { - background: rgba(255, 255, 255, 0.85); - border-radius: 15px; - padding: 20px; - margin-bottom: 20px; - box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08); - text-align: center; -} - -.stats-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); - gap: 20px; - margin-top: 15px; -} - -.stat-item { - padding: 15px; - background: rgba(129, 199, 132, 0.1); - border-radius: 10px; -} - -.stat-number { - font-size: 1.5rem; - font-weight: 700; - color: #2d5016; -} - -.stat-label { - color: #5a7c65; - font-size: 0.9rem; - margin-top: 5px; -} - -/* 响应式设计 */ - -/* 平板端 */ -@media (max-width: 768px) and (min-width: 481px) { - .container { - padding: 15px; - } - - .header h1 { - font-size: 2rem; - flex-direction: column; - gap: 10px; - } - - .header { - padding: 20px; - } - - .rates-grid { - grid-template-columns: repeat(6, 1fr); - gap: 8px; - } - - .rate-card { - padding: 10px; - } - - .currency-selector select { - min-width: 180px; - } -} - -/* 手机端 */ -@media (max-width: 480px) { - .container { - padding: 10px; - } - - .header { - padding: 15px; - margin-bottom: 20px; - } - - .header h1 { - font-size: 1.8rem; - } - - .rates-grid { - grid-template-columns: repeat(4, 1fr); - gap: 6px; - } - - .rate-card { - padding: 8px; - border-radius: 8px; - } - - .currency-code { - font-size: 0.85rem; - margin-bottom: 4px; - gap: 4px; - } - - .currency-flag { - font-size: 1rem; - } - - .exchange-rate { - font-size: 0.9rem; - margin-bottom: 3px; - } - - .currency-name { - font-size: 0.7rem; - line-height: 1.1; - } - - .currency-selector { - padding: 15px; - } - - .currency-selector select { - min-width: 100%; - padding: 10px 15px; - } - - .search-input { - padding: 10px 15px; - } - - .stats-grid { - grid-template-columns: repeat(2, 1fr); - gap: 10px; - } -} - -/* 大屏幕优化 */ -@media (min-width: 1200px) { - .container { - padding: 40px; - } - - .header { - padding: 40px; - } -} - -/* 特殊效果 */ -.fade-in { - animation: fadeIn 0.6s ease-in; -} - -@keyframes fadeIn { - from { - opacity: 0; - transform: translateY(20px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -/* 滚动条样式 */ -::-webkit-scrollbar { - width: 8px; -} - -::-webkit-scrollbar-track { - background: rgba(255, 255, 255, 0.1); -} - -::-webkit-scrollbar-thumb { - background: rgba(129, 199, 132, 0.5); - border-radius: 4px; -} - -::-webkit-scrollbar-thumb:hover { - background: rgba(129, 199, 132, 0.7); -} - -/* 隐藏类 */ -.hidden { - display: none; -} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/日更资讯/每日国际汇率/index.html b/frontend/react-app/public/60sapi/日更资讯/每日国际汇率/index.html deleted file mode 100644 index 644740d2..00000000 --- a/frontend/react-app/public/60sapi/日更资讯/每日国际汇率/index.html +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - - - 每日国际汇率 - - - - - - - - -
    - -
    -

    - 💱 - 每日国际汇率 -

    -

    实时获取全球货币汇率信息,助您掌握汇率动态

    -
    - - -
    - - -
    - - -
    - -
    - - -
    -
    -

    正在加载汇率数据...

    -
    - - -
    - -
    -
    -

    基础货币

    -
    更新时间: --
    -
    - - -
    -

    汇率统计

    -
    -
    -
    --
    -
    货币总数
    -
    -
    -
    --
    -
    最后更新
    -
    -
    -
    - - -
    - -
    -
    -
    -
    - - - - - \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/日更资讯/每日国际汇率/js/script.js b/frontend/react-app/public/60sapi/日更资讯/每日国际汇率/js/script.js deleted file mode 100644 index d7d217b3..00000000 --- a/frontend/react-app/public/60sapi/日更资讯/每日国际汇率/js/script.js +++ /dev/null @@ -1,520 +0,0 @@ -// 每日国际汇率 JavaScript 功能 - -// API配置 -const API = { - endpoints: [], - currentIndex: 0, - defaultCurrency: 'CNY', - localFallback: '返回接口.json', - // 初始化API接口列表 - async init() { - try { - const res = await fetch('./接口集合.json'); - const endpoints = await res.json(); - this.endpoints = endpoints.map(endpoint => `${endpoint}/v2/exchange_rate`); - } catch (e) { - // 如果无法加载接口集合,使用默认接口 - this.endpoints = ['https://60s.viki.moe/v2/exchange_rate']; - } - }, - // 获取当前接口URL - getCurrentUrl(currency) { - if (this.endpoints.length === 0) return null; - const url = new URL(this.endpoints[this.currentIndex]); - url.searchParams.append('currency', currency); - return url.toString(); - }, - // 切换到下一个接口 - switchToNext() { - this.currentIndex = (this.currentIndex + 1) % this.endpoints.length; - return this.currentIndex < this.endpoints.length; - }, - // 重置到第一个接口 - reset() { - this.currentIndex = 0; - } -}; - -// 常用货币列表 -const POPULAR_CURRENCIES = [ - { code: 'CNY', name: '人民币', flag: '🇨🇳' }, - { code: 'USD', name: '美元', flag: '🇺🇸' }, - { code: 'EUR', name: '欧元', flag: '🇪🇺' }, - { code: 'JPY', name: '日元', flag: '🇯🇵' }, - { code: 'GBP', name: '英镑', flag: '🇬🇧' }, - { code: 'AUD', name: '澳元', flag: '🇦🇺' }, - { code: 'CAD', name: '加元', flag: '🇨🇦' }, - { code: 'CHF', name: '瑞士法郎', flag: '🇨🇭' }, - { code: 'HKD', name: '港币', flag: '🇭🇰' }, - { code: 'SGD', name: '新加坡元', flag: '🇸🇬' }, - { code: 'KRW', name: '韩元', flag: '🇰🇷' }, - { code: 'THB', name: '泰铢', flag: '🇹🇭' } -]; - -// 货币优先级排序 - 经济发达、交易频繁的国家货币优先 -const CURRENCY_PRIORITY = { - // 第一梯队:全球主要储备货币和交易货币 - 'USD': 1, // 美元 - 全球储备货币 - 'EUR': 2, // 欧元 - 欧盟统一货币 - 'JPY': 3, // 日元 - 亚洲主要货币 - 'GBP': 4, // 英镑 - 传统储备货币 - 'CNY': 5, // 人民币 - 中国货币 - - // 第二梯队:发达国家货币 - 'CHF': 10, // 瑞士法郎 - 避险货币 - 'CAD': 11, // 加拿大元 - 'AUD': 12, // 澳大利亚元 - 'NZD': 13, // 新西兰元 - 'SEK': 14, // 瑞典克朗 - 'NOK': 15, // 挪威克朗 - 'DKK': 16, // 丹麦克朗 - - // 第三梯队:亚洲发达经济体 - 'HKD': 20, // 港币 - 'SGD': 21, // 新加坡元 - 'KRW': 22, // 韩元 - 'TWD': 23, // 新台币 - - // 第四梯队:重要新兴市场货币 - 'RUB': 30, // 俄罗斯卢布 - 'INR': 31, // 印度卢比 - 'BRL': 32, // 巴西雷亚尔 - 'MXN': 33, // 墨西哥比索 - 'ZAR': 34, // 南非兰特 - 'TRY': 35, // 土耳其里拉 - - // 第五梯队:亚洲重要货币 - 'THB': 40, // 泰铢 - 'MYR': 41, // 马来西亚林吉特 - 'IDR': 42, // 印尼盾 - 'PHP': 43, // 菲律宾比索 - 'VND': 44, // 越南盾 - - // 第六梯队:中东石油国家货币 - 'SAR': 50, // 沙特里亚尔 - 'AED': 51, // 阿联酋迪拉姆 - 'QAR': 52, // 卡塔尔里亚尔 - 'KWD': 53, // 科威特第纳尔 - - // 第七梯队:欧洲其他货币 - 'PLN': 60, // 波兰兹罗提 - 'CZK': 61, // 捷克克朗 - 'HUF': 62, // 匈牙利福林 - 'RON': 63, // 罗马尼亚列伊 - 'BGN': 64, // 保加利亚列弗 - 'HRK': 65, // 克罗地亚库纳 - - // 第八梯队:拉美货币 - 'ARS': 70, // 阿根廷比索 - 'CLP': 71, // 智利比索 - 'COP': 72, // 哥伦比亚比索 - 'PEN': 73, // 秘鲁索尔 - 'UYU': 74, // 乌拉圭比索 - - // 其他货币默认优先级为 999 -}; - -// 货币名称映射 -const CURRENCY_NAMES = { - 'CNY': '人民币', 'USD': '美元', 'EUR': '欧元', 'JPY': '日元', 'GBP': '英镑', - 'AUD': '澳元', 'CAD': '加元', 'CHF': '瑞士法郎', 'HKD': '港币', 'SGD': '新加坡元', - 'KRW': '韩元', 'THB': '泰铢', 'AED': '阿联酋迪拉姆', 'AFN': '阿富汗尼', - 'ALL': '阿尔巴尼亚列克', 'AMD': '亚美尼亚德拉姆', 'ANG': '荷属安的列斯盾', - 'AOA': '安哥拉宽扎', 'ARS': '阿根廷比索', 'AWG': '阿鲁巴弗罗林', - 'AZN': '阿塞拜疆马纳特', 'BAM': '波黑马克', 'BBD': '巴巴多斯元', - 'BDT': '孟加拉塔卡', 'BGN': '保加利亚列弗', 'BHD': '巴林第纳尔', - 'BIF': '布隆迪法郎', 'BMD': '百慕大元', 'BND': '文莱元', 'BOB': '玻利维亚诺', - 'BRL': '巴西雷亚尔', 'BSD': '巴哈马元', 'BTN': '不丹努尔特鲁姆', - 'BWP': '博茨瓦纳普拉', 'BYN': '白俄罗斯卢布', 'BZD': '伯利兹元', - 'CDF': '刚果法郎', 'CLP': '智利比索', 'COP': '哥伦比亚比索', 'CRC': '哥斯达黎加科朗', - 'CUP': '古巴比索', 'CVE': '佛得角埃斯库多', 'CZK': '捷克克朗', 'DJF': '吉布提法郎', - 'DKK': '丹麦克朗', 'DOP': '多米尼加比索', 'DZD': '阿尔及利亚第纳尔', 'EGP': '埃及镑', - 'ERN': '厄立特里亚纳克法', 'ETB': '埃塞俄比亚比尔', 'FJD': '斐济元', 'FKP': '福克兰群岛镑', - 'FOK': '法罗群岛克朗', 'GEL': '格鲁吉亚拉里', 'GGP': '根西岛镑', 'GHS': '加纳塞地', - 'GIP': '直布罗陀镑', 'GMD': '冈比亚达拉西', 'GNF': '几内亚法郎', 'GTQ': '危地马拉格查尔', - 'GYD': '圭亚那元', 'HNL': '洪都拉斯伦皮拉', 'HRK': '克罗地亚库纳', 'HTG': '海地古德', - 'HUF': '匈牙利福林', 'IDR': '印尼盾', 'ILS': '以色列新谢克尔', 'IMP': '马恩岛镑', - 'INR': '印度卢比', 'IQD': '伊拉克第纳尔', 'IRR': '伊朗里亚尔', 'ISK': '冰岛克朗', - 'JEP': '泽西岛镑', 'JMD': '牙买加元', 'JOD': '约旦第纳尔', 'KES': '肯尼亚先令', - 'KGS': '吉尔吉斯斯坦索姆', 'KHR': '柬埔寨瑞尔', 'KID': '基里巴斯元', 'KMF': '科摩罗法郎', - 'KWD': '科威特第纳尔', 'KYD': '开曼群岛元', 'KZT': '哈萨克斯坦坚戈', 'LAK': '老挝基普', - 'LBP': '黎巴嫩镑', 'LKR': '斯里兰卡卢比', 'LRD': '利比里亚元', 'LSL': '莱索托洛蒂', - 'LYD': '利比亚第纳尔', 'MAD': '摩洛哥迪拉姆', 'MDL': '摩尔多瓦列伊', 'MGA': '马达加斯加阿里亚里', - 'MKD': '北马其顿第纳尔', 'MMK': '缅甸缅元', 'MNT': '蒙古图格里克', 'MOP': '澳门帕塔卡', - 'MRU': '毛里塔尼亚乌吉亚', 'MUR': '毛里求斯卢比', 'MVR': '马尔代夫拉菲亚', 'MWK': '马拉维克瓦查', - 'MXN': '墨西哥比索', 'MYR': '马来西亚林吉特', 'MZN': '莫桑比克梅蒂卡尔', 'NAD': '纳米比亚元', - 'NGN': '尼日利亚奈拉', 'NIO': '尼加拉瓜科多巴', 'NOK': '挪威克朗', 'NPR': '尼泊尔卢比', - 'NZD': '新西兰元', 'OMR': '阿曼里亚尔', 'PAB': '巴拿马巴波亚', 'PEN': '秘鲁索尔', - 'PGK': '巴布亚新几内亚基那', 'PHP': '菲律宾比索', 'PKR': '巴基斯坦卢比', 'PLN': '波兰兹罗提', - 'PYG': '巴拉圭瓜拉尼', 'QAR': '卡塔尔里亚尔', 'RON': '罗马尼亚列伊', 'RSD': '塞尔维亚第纳尔', - 'RUB': '俄罗斯卢布', 'RWF': '卢旺达法郎', 'SAR': '沙特里亚尔', 'SBD': '所罗门群岛元', - 'SCR': '塞舌尔卢比', 'SDG': '苏丹镑', 'SEK': '瑞典克朗', 'SHP': '圣赫勒拿镑', - 'SLE': '塞拉利昂利昂', 'SLL': '塞拉利昂利昂(旧)', 'SOS': '索马里先令', 'SRD': '苏里南元', - 'SSP': '南苏丹镑', 'STN': '圣多美和普林西比多布拉', 'SYP': '叙利亚镑', 'SZL': '斯威士兰里兰吉尼', - 'TJS': '塔吉克斯坦索莫尼', 'TMT': '土库曼斯坦马纳特', 'TND': '突尼斯第纳尔', 'TOP': '汤加潘加', - 'TRY': '土耳其里拉', 'TTD': '特立尼达和多巴哥元', 'TVD': '图瓦卢元', 'TWD': '新台币', - 'TZS': '坦桑尼亚先令', 'UAH': '乌克兰格里夫纳', 'UGX': '乌干达先令', 'UYU': '乌拉圭比索', - 'UZS': '乌兹别克斯坦苏姆', 'VES': '委内瑞拉玻利瓦尔', 'VND': '越南盾', 'VUV': '瓦努阿图瓦图', - 'WST': '萨摩亚塔拉', 'XAF': '中非法郎', 'XCD': '东加勒比元', 'XCG': '加勒比盾', - 'XDR': '特别提款权', 'XOF': '西非法郎', 'XPF': '太平洋法郎', 'YER': '也门里亚尔', - 'ZAR': '南非兰特', 'ZMW': '赞比亚克瓦查', 'ZWL': '津巴布韦元' -}; - -// 货币旗帜映射 -const CURRENCY_FLAGS = { - 'CNY': '🇨🇳', 'USD': '🇺🇸', 'EUR': '🇪🇺', 'JPY': '🇯🇵', 'GBP': '🇬🇧', - 'AUD': '🇦🇺', 'CAD': '🇨🇦', 'CHF': '🇨🇭', 'HKD': '🇭🇰', 'SGD': '🇸🇬', - 'KRW': '🇰🇷', 'THB': '🇹🇭', 'AED': '🇦🇪', 'AFN': '🇦🇫', 'ALL': '🇦🇱', - 'AMD': '🇦🇲', 'ANG': '🇳🇱', 'AOA': '🇦🇴', 'ARS': '🇦🇷', 'AWG': '🇦🇼', - 'AZN': '🇦🇿', 'BAM': '🇧🇦', 'BBD': '🇧🇧', 'BDT': '🇧🇩', 'BGN': '🇧🇬', - 'BHD': '🇧🇭', 'BIF': '🇧🇮', 'BMD': '🇧🇲', 'BND': '🇧🇳', 'BOB': '🇧🇴', - 'BRL': '🇧🇷', 'BSD': '🇧🇸', 'BTN': '🇧🇹', 'BWP': '🇧🇼', 'BYN': '🇧🇾', - 'BZD': '🇧🇿', 'CDF': '🇨🇩', 'CLP': '🇨🇱', 'COP': '🇨🇴', 'CRC': '🇨🇷', - 'CUP': '🇨🇺', 'CVE': '🇨🇻', 'CZK': '🇨🇿', 'DJF': '🇩🇯', 'DKK': '🇩🇰', - 'DOP': '🇩🇴', 'DZD': '🇩🇿', 'EGP': '🇪🇬', 'ERN': '🇪🇷', 'ETB': '🇪🇹', - 'FJD': '🇫🇯', 'FKP': '🇫🇰', 'FOK': '🇫🇴', 'GEL': '🇬🇪', 'GGP': '🇬🇬', - 'GHS': '🇬🇭', 'GIP': '🇬🇮', 'GMD': '🇬🇲', 'GNF': '🇬🇳', 'GTQ': '🇬🇹', - 'GYD': '🇬🇾', 'HNL': '🇭🇳', 'HRK': '🇭🇷', 'HTG': '🇭🇹', 'HUF': '🇭🇺', - 'IDR': '🇮🇩', 'ILS': '🇮🇱', 'IMP': '🇮🇲', 'INR': '🇮🇳', 'IQD': '🇮🇶', - 'IRR': '🇮🇷', 'ISK': '🇮🇸', 'JEP': '🇯🇪', 'JMD': '🇯🇲', 'JOD': '🇯🇴', - 'KES': '🇰🇪', 'KGS': '🇰🇬', 'KHR': '🇰🇭', 'KID': '🇰🇮', 'KMF': '🇰🇲', - 'KWD': '🇰🇼', 'KYD': '🇰🇾', 'KZT': '🇰🇿', 'LAK': '🇱🇦', 'LBP': '🇱🇧', - 'LKR': '🇱🇰', 'LRD': '🇱🇷', 'LSL': '🇱🇸', 'LYD': '🇱🇾', 'MAD': '🇲🇦', - 'MDL': '🇲🇩', 'MGA': '🇲🇬', 'MKD': '🇲🇰', 'MMK': '🇲🇲', 'MNT': '🇲🇳', - 'MOP': '🇲🇴', 'MRU': '🇲🇷', 'MUR': '🇲🇺', 'MVR': '🇲🇻', 'MWK': '🇲🇼', - 'MXN': '🇲🇽', 'MYR': '🇲🇾', 'MZN': '🇲🇿', 'NAD': '🇳🇦', 'NGN': '🇳🇬', - 'NIO': '🇳🇮', 'NOK': '🇳🇴', 'NPR': '🇳🇵', 'NZD': '🇳🇿', 'OMR': '🇴🇲', - 'PAB': '🇵🇦', 'PEN': '🇵🇪', 'PGK': '🇵🇬', 'PHP': '🇵🇭', 'PKR': '🇵🇰', - 'PLN': '🇵🇱', 'PYG': '🇵🇾', 'QAR': '🇶🇦', 'RON': '🇷🇴', 'RSD': '🇷🇸', - 'RUB': '🇷🇺', 'RWF': '🇷🇼', 'SAR': '🇸🇦', 'SBD': '🇸🇧', 'SCR': '🇸🇨', - 'SDG': '🇸🇩', 'SEK': '🇸🇪', 'SHP': '🇸🇭', 'SLE': '🇸🇱', 'SLL': '🇸🇱', - 'SOS': '🇸🇴', 'SRD': '🇸🇷', 'SSP': '🇸🇸', 'STN': '🇸🇹', 'SYP': '🇸🇾', - 'SZL': '🇸🇿', 'TJS': '🇹🇯', 'TMT': '🇹🇲', 'TND': '🇹🇳', 'TOP': '🇹🇴', - 'TRY': '🇹🇷', 'TTD': '🇹🇹', 'TVD': '🇹🇻', 'TWD': '🇹🇼', 'TZS': '🇹🇿', - 'UAH': '🇺🇦', 'UGX': '🇺🇬', 'UYU': '🇺🇾', 'UZS': '🇺🇿', 'VES': '🇻🇪', - 'VND': '🇻🇳', 'VUV': '🇻🇺', 'WST': '🇼🇸', 'XAF': '🌍', 'XCD': '🏝️', - 'XCG': '🏝️', 'XDR': '🌐', 'XOF': '🌍', 'XPF': '🌊', 'YER': '🇾🇪', - 'ZAR': '🇿🇦', 'ZMW': '🇿🇲', 'ZWL': '🇿🇼' -}; - -// DOM元素 -let elements = {}; -let currentRates = []; -let filteredRates = []; - -// 初始化 -document.addEventListener('DOMContentLoaded', function() { - initElements(); - initCurrencySelector(); - bindEvents(); - loadExchangeRates(); -}); - -// 初始化DOM元素 -function initElements() { - elements = { - currencySelect: document.getElementById('currency-select'), - searchInput: document.getElementById('search-input'), - loading: document.getElementById('loading'), - content: document.getElementById('exchange-content'), - baseCurrency: document.getElementById('base-currency'), - updateTime: document.getElementById('update-time'), - ratesGrid: document.getElementById('rates-grid'), - totalCurrencies: document.getElementById('total-currencies'), - lastUpdate: document.getElementById('last-update') - }; -} - -// 初始化货币选择器 -function initCurrencySelector() { - if (!elements.currencySelect) return; - - // 添加常用货币选项 - POPULAR_CURRENCIES.forEach(currency => { - const option = document.createElement('option'); - option.value = currency.code; - option.textContent = `${currency.flag} ${currency.code} - ${currency.name}`; - if (currency.code === API.defaultCurrency) { - option.selected = true; - } - elements.currencySelect.appendChild(option); - }); -} - -// 绑定事件 -function bindEvents() { - // 货币选择变化 - if (elements.currencySelect) { - elements.currencySelect.addEventListener('change', function() { - loadExchangeRates(this.value); - }); - } - - // 搜索功能 - if (elements.searchInput) { - elements.searchInput.addEventListener('input', function() { - filterRates(this.value); - }); - } -} - -// 加载汇率数据 -async function loadExchangeRates(currency = API.defaultCurrency) { - try { - showLoading(true); - - // 尝试从API获取数据 - const data = await fetchFromAPI(currency); - - if (data && data.code === 200 && data.data) { - currentRates = data.data.rates || []; - displayExchangeRates(data.data); - } else { - // 尝试从本地获取数据 - const localData = await fetchFromLocal(); - if (localData && localData.code === 200 && localData.data) { - currentRates = localData.data.rates || []; - displayExchangeRates(localData.data); - showError('使用本地数据,可能不是最新汇率'); - } else { - throw new Error('无法获取汇率数据'); - } - } - - } catch (error) { - console.error('加载汇率失败:', error); - showError('加载汇率数据失败,请稍后重试'); - } finally { - showLoading(false); - } -} - -// 从API获取数据 -async function fetchFromAPI(currency) { - // 初始化API接口列表 - await API.init(); - - // 重置API索引到第一个接口 - API.reset(); - - // 尝试所有API接口 - for (let i = 0; i < API.endpoints.length; i++) { - try { - const url = API.getCurrentUrl(currency); - console.log(`尝试接口 ${i + 1}/${API.endpoints.length}: ${url}`); - - const response = await fetch(url, { - cache: 'no-store' - }); - - if (!response.ok) { - throw new Error(`HTTP ${response.status}: ${response.statusText}`); - } - - const data = await response.json(); - - if (data && data.code === 200) { - console.log(`接口 ${i + 1} 请求成功`); - return data; - } - - throw new Error(data && data.message ? data.message : '接口返回异常'); - - } catch (e) { - console.warn(`接口 ${i + 1} 失败:`, e.message); - - // 如果不是最后一个接口,切换到下一个 - if (i < API.endpoints.length - 1) { - API.switchToNext(); - continue; - } - - // 所有接口都失败了 - console.warn('所有远程接口都失败,尝试本地数据'); - return null; - } - } -} - -// 从本地获取数据 -async function fetchFromLocal() { - try { - const response = await fetch(API.localFallback + `?t=${Date.now()}`); - if (!response.ok) throw new Error(`本地文件HTTP ${response.status}`); - const data = await response.json(); - return data; - } catch (e) { - console.error('读取本地返回接口.json失败:', e); - return null; - } -} - -// 显示汇率数据 -function displayExchangeRates(data) { - if (!data || !data.rates) { - showError('没有获取到汇率数据'); - return; - } - - // 更新基础货币信息 - if (elements.baseCurrency) { - const baseCurrencyName = CURRENCY_NAMES[data.base_code] || data.base_code; - const baseCurrencyFlag = CURRENCY_FLAGS[data.base_code] || '💱'; - elements.baseCurrency.textContent = `${baseCurrencyFlag} ${data.base_code} - ${baseCurrencyName}`; - } - - // 更新时间信息 - if (elements.updateTime && data.updated) { - elements.updateTime.textContent = `更新时间: ${data.updated}`; - } - - // 更新统计信息 - updateStats(data); - - // 显示汇率列表 - filteredRates = data.rates; - renderRates(filteredRates); - - // 显示内容区域 - if (elements.content) { - elements.content.classList.add('fade-in'); - elements.content.style.display = 'block'; - } -} - -// 更新统计信息 -function updateStats(data) { - if (elements.totalCurrencies) { - elements.totalCurrencies.textContent = data.rates ? data.rates.length : 0; - } - - if (elements.lastUpdate && data.updated) { - elements.lastUpdate.textContent = data.updated; - } -} - -// 渲染汇率列表 -function renderRates(rates) { - if (!elements.ratesGrid || !rates) return; - - // 按优先级排序货币 - const sortedRates = [...rates].sort((a, b) => { - const priorityA = CURRENCY_PRIORITY[a.currency] || 999; - const priorityB = CURRENCY_PRIORITY[b.currency] || 999; - - // 优先级相同时按货币代码字母顺序排序 - if (priorityA === priorityB) { - return a.currency.localeCompare(b.currency); - } - - return priorityA - priorityB; - }); - - elements.ratesGrid.innerHTML = ''; - - sortedRates.forEach(rate => { - const rateCard = createRateCard(rate); - elements.ratesGrid.appendChild(rateCard); - }); -} - -// 创建汇率卡片 -function createRateCard(rate) { - const card = document.createElement('div'); - card.className = 'rate-card'; - - const currencyName = CURRENCY_NAMES[rate.currency] || rate.currency; - const currencyFlag = CURRENCY_FLAGS[rate.currency] || '💱'; - - card.innerHTML = ` -
    - ${currencyFlag} - ${rate.currency} -
    -
    ${formatRate(rate.rate)}
    -
    ${currencyName}
    - `; - - return card; -} - -// 格式化汇率 -function formatRate(rate) { - if (rate >= 1) { - return rate.toFixed(4); - } else if (rate >= 0.01) { - return rate.toFixed(6); - } else { - return rate.toFixed(8); - } -} - -// 过滤汇率数据 -function filterRates(searchTerm) { - if (!searchTerm.trim()) { - renderRates(currentRates); - return; - } - - const filtered = currentRates.filter(rate => { - const currencyName = CURRENCY_NAMES[rate.currency] || rate.currency; - return rate.currency.toLowerCase().includes(searchTerm.toLowerCase()) || - currencyName.toLowerCase().includes(searchTerm.toLowerCase()); - }); - - renderRates(filtered); -} - -// 显示/隐藏加载状态 -function showLoading(show) { - if (elements.loading) { - elements.loading.style.display = show ? 'block' : 'none'; - } - if (elements.content) { - elements.content.style.display = show ? 'none' : 'block'; - } -} - -// 显示错误信息 -function showError(message) { - if (elements.content) { - elements.content.innerHTML = ` -
    -

    ⚠️ 加载失败

    -

    ${escapeHtml(message)}

    -

    请检查网络连接或稍后重试

    -
    - `; - elements.content.style.display = 'block'; - } -} - -// HTML转义 -function escapeHtml(text) { - if (!text) return ''; - const div = document.createElement('div'); - div.textContent = text; - return div.innerHTML; -} - -// 错误处理 -window.addEventListener('error', function(event) { - console.error('页面错误:', event.error); -}); - -// 网络状态监听 -window.addEventListener('online', function() { - console.log('网络已连接'); -}); - -window.addEventListener('offline', function() { - console.log('网络已断开'); - showError('网络连接已断开,请检查网络设置'); -}); - -// 导出函数供外部调用 -window.ExchangeRate = { - loadExchangeRates, - showError, - showLoading -}; \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/日更资讯/每日国际汇率/接口集合.json b/frontend/react-app/public/60sapi/日更资讯/每日国际汇率/接口集合.json deleted file mode 100644 index 04e92b7f..00000000 --- a/frontend/react-app/public/60sapi/日更资讯/每日国际汇率/接口集合.json +++ /dev/null @@ -1,7 +0,0 @@ -[ - "https://60s-cf.viki.moe", - "https://60s.viki.moe", - "https://60s.b23.run", - "https://60s.114128.xyz", - "https://60s-cf.114128.xyz" -] diff --git a/frontend/react-app/public/60sapi/日更资讯/每日国际汇率/返回接口.json b/frontend/react-app/public/60sapi/日更资讯/每日国际汇率/返回接口.json deleted file mode 100644 index b376d9c2..00000000 --- a/frontend/react-app/public/60sapi/日更资讯/每日国际汇率/返回接口.json +++ /dev/null @@ -1 +0,0 @@ -{"code":200,"message":"获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841","data":{"base_code":"CNY","updated":"2025/08/19 08:02:31","updated_at":1755561751000,"next_updated":"2025/08/20 08:11:41","next_updated_at":1755648701000,"rates":[{"currency":"CNY","rate":1},{"currency":"AED","rate":0.511124},{"currency":"AFN","rate":9.517171},{"currency":"ALL","rate":11.591448},{"currency":"AMD","rate":53.380737},{"currency":"ANG","rate":0.249125},{"currency":"AOA","rate":130.082117},{"currency":"ARS","rate":180.766035},{"currency":"AUD","rate":0.214039},{"currency":"AWG","rate":0.249125},{"currency":"AZN","rate":0.236907},{"currency":"BAM","rate":0.233194},{"currency":"BBD","rate":0.278352},{"currency":"BDT","rate":16.911823},{"currency":"BGN","rate":0.233216},{"currency":"BHD","rate":0.05233},{"currency":"BIF","rate":416.872549},{"currency":"BMD","rate":0.139176},{"currency":"BND","rate":0.178681},{"currency":"BOB","rate":0.962893},{"currency":"BRL","rate":0.752907},{"currency":"BSD","rate":0.139176},{"currency":"BTN","rate":12.167157},{"currency":"BWP","rate":1.952087},{"currency":"BYN","rate":0.44452},{"currency":"BZD","rate":0.278352},{"currency":"CAD","rate":0.19212},{"currency":"CDF","rate":404.961905},{"currency":"CHF","rate":0.112314},{"currency":"CLP","rate":134.245001},{"currency":"COP","rate":560.180139},{"currency":"CRC","rate":70.415535},{"currency":"CUP","rate":3.340225},{"currency":"CVE","rate":13.146924},{"currency":"CZK","rate":2.918414},{"currency":"DJF","rate":24.734508},{"currency":"DKK","rate":0.889716},{"currency":"DOP","rate":8.582359},{"currency":"DZD","rate":18.079862},{"currency":"EGP","rate":6.734271},{"currency":"ERN","rate":2.087641},{"currency":"ETB","rate":19.722171},{"currency":"EUR","rate":0.119223},{"currency":"FJD","rate":0.314391},{"currency":"FKP","rate":0.102914},{"currency":"FOK","rate":0.889734},{"currency":"GBP","rate":0.102909},{"currency":"GEL","rate":0.375537},{"currency":"GGP","rate":0.102914},{"currency":"GHS","rate":1.578239},{"currency":"GIP","rate":0.102914},{"currency":"GMD","rate":10.138575},{"currency":"GNF","rate":1210.235138},{"currency":"GTQ","rate":1.068254},{"currency":"GYD","rate":29.143934},{"currency":"HKD","rate":1.088795},{"currency":"HNL","rate":3.652528},{"currency":"HRK","rate":0.89834},{"currency":"HTG","rate":18.225889},{"currency":"HUF","rate":47.111579},{"currency":"IDR","rate":2251.38752},{"currency":"ILS","rate":0.471627},{"currency":"IMP","rate":0.102914},{"currency":"INR","rate":12.167163},{"currency":"IQD","rate":182.493562},{"currency":"IRR","rate":5947.331641},{"currency":"ISK","rate":17.059481},{"currency":"JEP","rate":0.102914},{"currency":"JMD","rate":22.284011},{"currency":"JOD","rate":0.098676},{"currency":"JPY","rate":20.560161},{"currency":"KES","rate":18.001838},{"currency":"KGS","rate":12.154697},{"currency":"KHR","rate":559.486842},{"currency":"KID","rate":0.213953},{"currency":"KMF","rate":58.657438},{"currency":"KRW","rate":193.082196},{"currency":"KWD","rate":0.042467},{"currency":"KYD","rate":0.11598},{"currency":"KZT","rate":75.044843},{"currency":"LAK","rate":3020.068103},{"currency":"LBP","rate":12456.256905},{"currency":"LKR","rate":41.92144},{"currency":"LRD","rate":27.931467},{"currency":"LSL","rate":2.453056},{"currency":"LYD","rate":0.753251},{"currency":"MAD","rate":1.256183},{"currency":"MDL","rate":2.318865},{"currency":"MGA","rate":616.246377},{"currency":"MKD","rate":7.330199},{"currency":"MMK","rate":292.821503},{"currency":"MNT","rate":496.284455},{"currency":"MOP","rate":1.121431},{"currency":"MRU","rate":5.575062},{"currency":"MUR","rate":6.322278},{"currency":"MVR","rate":2.152859},{"currency":"MWK","rate":242.759976},{"currency":"MXN","rate":2.615768},{"currency":"MYR","rate":0.587931},{"currency":"MZN","rate":8.897355},{"currency":"NAD","rate":2.453056},{"currency":"NGN","rate":213.548738},{"currency":"NIO","rate":5.126446},{"currency":"NOK","rate":1.418768},{"currency":"NPR","rate":19.467451},{"currency":"NZD","rate":0.234779},{"currency":"OMR","rate":0.053513},{"currency":"PAB","rate":0.139176},{"currency":"PEN","rate":0.494927},{"currency":"PGK","rate":0.582729},{"currency":"PHP","rate":7.93572},{"currency":"PKR","rate":39.46328},{"currency":"PLN","rate":0.506978},{"currency":"PYG","rate":1027.399127},{"currency":"QAR","rate":0.506601},{"currency":"RON","rate":0.603459},{"currency":"RSD","rate":13.970729},{"currency":"RUB","rate":11.172399},{"currency":"RWF","rate":202.11696},{"currency":"SAR","rate":0.52191},{"currency":"SBD","rate":1.166597},{"currency":"SCR","rate":2.048212},{"currency":"SDG","rate":62.256223},{"currency":"SEK","rate":1.330729},{"currency":"SGD","rate":0.178681},{"currency":"SHP","rate":0.102914},{"currency":"SLE","rate":3.233657},{"currency":"SLL","rate":3233.656465},{"currency":"SOS","rate":79.627341},{"currency":"SRD","rate":5.237221},{"currency":"SSP","rate":656.433807},{"currency":"STN","rate":2.921141},{"currency":"SYP","rate":1797.905083},{"currency":"SZL","rate":2.453056},{"currency":"THB","rate":4.522448},{"currency":"TJS","rate":1.304898},{"currency":"TMT","rate":0.487573},{"currency":"TND","rate":0.400111},{"currency":"TOP","rate":0.334775},{"currency":"TRY","rate":5.692494},{"currency":"TTD","rate":0.944407},{"currency":"TVD","rate":0.213953},{"currency":"TWD","rate":4.180337},{"currency":"TZS","rate":362.491953},{"currency":"UAH","rate":5.749996},{"currency":"UGX","rate":495.482314},{"currency":"USD","rate":0.139189},{"currency":"UYU","rate":5.574},{"currency":"UZS","rate":1755.559577},{"currency":"VES","rate":19.06244},{"currency":"VND","rate":3651.953637},{"currency":"VUV","rate":16.614981},{"currency":"WST","rate":0.37355},{"currency":"XAF","rate":78.209917},{"currency":"XCD","rate":0.375775},{"currency":"XCG","rate":0.249125},{"currency":"XDR","rate":0.101791},{"currency":"XOF","rate":78.209917},{"currency":"XPF","rate":14.227984},{"currency":"YER","rate":33.479791},{"currency":"ZAR","rate":2.453082},{"currency":"ZMW","rate":3.244378},{"currency":"ZWL","rate":3.727233}]}} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/热搜榜单/HackerNews榜单/css/background.css b/frontend/react-app/public/60sapi/热搜榜单/HackerNews榜单/css/background.css deleted file mode 100644 index b889760c..00000000 --- a/frontend/react-app/public/60sapi/热搜榜单/HackerNews榜单/css/background.css +++ /dev/null @@ -1,106 +0,0 @@ -/* 彩虹背景相关样式 */ -body { - background: linear-gradient( - 135deg, - #ff6b6b 0%, - #4ecdc4 12.5%, - #45b7d1 25%, - #96ceb4 37.5%, - #feca57 50%, - #ff9ff3 62.5%, - #54a0ff 75%, - #5f27cd 87.5%, - #00d2d3 100% - ); - background-size: 400% 400%; - animation: rainbowGradient 15s ease infinite; - background-attachment: fixed; - min-height: 100vh; - position: relative; -} - -@keyframes rainbowGradient { - 0% { - background-position: 0% 50%; - } - 25% { - background-position: 100% 50%; - } - 50% { - background-position: 100% 100%; - } - 75% { - background-position: 0% 100%; - } - 100% { - background-position: 0% 50%; - } -} - -/* 彩虹装饰层 */ -body::before { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: - radial-gradient(circle at 20% 20%, rgba(255, 107, 107, 0.15) 0%, transparent 50%), - radial-gradient(circle at 80% 80%, rgba(78, 205, 196, 0.15) 0%, transparent 50%), - radial-gradient(circle at 40% 80%, rgba(69, 183, 209, 0.12) 0%, transparent 40%), - radial-gradient(circle at 60% 20%, rgba(150, 206, 180, 0.12) 0%, transparent 40%), - radial-gradient(circle at 80% 40%, rgba(254, 202, 87, 0.1) 0%, transparent 35%); - pointer-events: none; - z-index: -1; - animation: float 20s ease-in-out infinite alternate; -} - -/* 彩虹粒子效果 */ -body::after { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - radial-gradient(circle at 10% 10%, rgba(255, 107, 107, 0.8) 2px, transparent 2px), - radial-gradient(circle at 30% 20%, rgba(78, 205, 196, 0.8) 1.5px, transparent 1.5px), - radial-gradient(circle at 50% 30%, rgba(69, 183, 209, 0.8) 1px, transparent 1px), - radial-gradient(circle at 70% 40%, rgba(150, 206, 180, 0.8) 2px, transparent 2px), - radial-gradient(circle at 90% 50%, rgba(254, 202, 87, 0.8) 1.5px, transparent 1.5px), - radial-gradient(circle at 20% 60%, rgba(255, 159, 243, 0.8) 1px, transparent 1px), - radial-gradient(circle at 40% 70%, rgba(84, 160, 255, 0.8) 2px, transparent 2px), - radial-gradient(circle at 60% 80%, rgba(95, 39, 205, 0.8) 1.5px, transparent 1.5px), - radial-gradient(circle at 80% 90%, rgba(0, 210, 211, 0.8) 1px, transparent 1px); - background-size: 200px 200px, 250px 250px, 180px 180px, 300px 300px, 220px 220px, 160px 160px, 280px 280px, 240px 240px, 200px 200px; - animation: sparkle 25s linear infinite; - pointer-events: none; - z-index: -1; - opacity: 0.6; -} - -@keyframes float { - 0% { - transform: translateY(0px) rotate(0deg); - } - 100% { - transform: translateY(-15px) rotate(2deg); - } -} - -@keyframes sparkle { - 0%, 100% { - transform: translateX(0) translateY(0) scale(1); - } - 25% { - transform: translateX(-10px) translateY(-5px) scale(1.1); - } - 50% { - transform: translateX(10px) translateY(-10px) scale(0.9); - } - 75% { - transform: translateX(-5px) translateY(-15px) scale(1.05); - } -} diff --git a/frontend/react-app/public/60sapi/热搜榜单/HackerNews榜单/css/style.css b/frontend/react-app/public/60sapi/热搜榜单/HackerNews榜单/css/style.css deleted file mode 100644 index caf27e8e..00000000 --- a/frontend/react-app/public/60sapi/热搜榜单/HackerNews榜单/css/style.css +++ /dev/null @@ -1,1037 +0,0 @@ -/* 重置样式 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Helvetica Neue', Arial, sans-serif; - line-height: 1.6; - color: #2c3e50; - overflow-x: hidden; -} - -/* 容器 */ -.container { - max-width: 1200px; - margin: 0 auto; - padding: 20px; - animation: containerFadeIn 1s ease-out; -} - -@keyframes containerFadeIn { - from { - opacity: 0; - transform: translateY(30px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -/* 头部 */ -.header { - text-align: center; - margin-bottom: 40px; - background: rgba(255, 255, 255, 0.95); - padding: 40px 30px; - border-radius: 25px; - box-shadow: - 0 10px 40px rgba(0, 0, 0, 0.1), - 0 0 0 1px rgba(255, 255, 255, 0.5); - backdrop-filter: blur(20px); - border: 2px solid transparent; - background-clip: padding-box; - position: relative; - overflow: hidden; -} - -.header::before { - content: ''; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: linear-gradient(45deg, - rgba(255, 107, 107, 0.1), - rgba(78, 205, 196, 0.1), - rgba(69, 183, 209, 0.1), - rgba(150, 206, 180, 0.1) - ); - animation: headerShimmer 4s ease-in-out infinite; - z-index: -1; -} - -@keyframes headerShimmer { - 0%, 100% { opacity: 0.3; } - 50% { opacity: 0.7; } -} - -.header-icon { - font-size: 4em; - margin-bottom: 15px; - animation: rainbowBounce 3s ease-in-out infinite; - text-shadow: 0 0 20px rgba(255, 255, 255, 0.8); -} - -@keyframes rainbowBounce { - 0%, 100% { - transform: translateY(0) scale(1); - filter: hue-rotate(0deg); - } - 25% { - transform: translateY(-10px) scale(1.05); - filter: hue-rotate(90deg); - } - 50% { - transform: translateY(-15px) scale(1.1); - filter: hue-rotate(180deg); - } - 75% { - transform: translateY(-5px) scale(1.05); - filter: hue-rotate(270deg); - } -} - -.title { - font-size: 3.2em; - font-weight: 800; - background: linear-gradient(45deg, #ff6b6b, #4ecdc4, #45b7d1, #96ceb4, #feca57, #ff9ff3); - background-size: 400% 400%; - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; - animation: rainbowText 3s ease-in-out infinite; - margin-bottom: 10px; - text-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - letter-spacing: 2px; -} - -@keyframes rainbowText { - 0%, 100% { background-position: 0% 50%; } - 50% { background-position: 100% 50%; } -} - -.subtitle { - font-size: 1.3em; - color: #34495e; - margin-bottom: 25px; - font-weight: 600; - opacity: 0.9; -} - -/* 标签切换 */ -.tab-container { - display: flex; - justify-content: center; - gap: 15px; - margin-bottom: 25px; - flex-wrap: wrap; -} - -.tab-btn { - background: linear-gradient(135deg, rgba(255, 255, 255, 0.9), rgba(255, 255, 255, 0.7)); - border: 2px solid transparent; - padding: 12px 24px; - border-radius: 25px; - cursor: pointer; - font-size: 1em; - font-weight: 600; - transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94); - position: relative; - overflow: hidden; - display: flex; - align-items: center; - gap: 8px; - color: #2c3e50; - backdrop-filter: blur(10px); - box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1); -} - -.tab-btn::before { - content: ''; - position: absolute; - top: 0; - left: -100%; - width: 100%; - height: 100%; - background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.4), transparent); - transition: left 0.5s ease; -} - -.tab-btn:hover::before { - left: 100%; -} - -.tab-btn.active { - background: linear-gradient(135deg, #ff6b6b, #4ecdc4); - color: white; - transform: translateY(-3px) scale(1.05); - box-shadow: 0 8px 25px rgba(255, 107, 107, 0.4); -} - -.tab-btn:hover { - transform: translateY(-2px); - box-shadow: 0 6px 20px rgba(0, 0, 0, 0.15); -} - -.tab-icon { - font-size: 1.2em; - transition: transform 0.3s ease; -} - -.tab-btn:hover .tab-icon { - transform: scale(1.2) rotate(10deg); -} - -.update-time { - display: flex; - align-items: center; - justify-content: center; - gap: 8px; - color: #34495e; - font-size: 1em; - margin-bottom: 20px; - padding: 10px 20px; - background: rgba(52, 73, 94, 0.1); - border-radius: 25px; - display: inline-flex; - backdrop-filter: blur(5px); -} - -.time-icon { - font-size: 1.2em; - animation: tick 2s infinite; -} - -@keyframes tick { - 0%, 50% { transform: rotate(0deg); } - 25% { transform: rotate(20deg); } - 75% { transform: rotate(-20deg); } -} - -.refresh-btn { - background: linear-gradient(135deg, #ff6b6b, #4ecdc4, #45b7d1); - background-size: 200% 200%; - color: white; - border: none; - padding: 15px 35px; - border-radius: 30px; - cursor: pointer; - font-size: 1.1em; - font-weight: 700; - transition: all 0.4s ease; - box-shadow: 0 6px 20px rgba(255, 107, 107, 0.3); - display: inline-flex; - align-items: center; - gap: 10px; - position: relative; - overflow: hidden; - animation: buttonRainbow 3s ease-in-out infinite; -} - -@keyframes buttonRainbow { - 0%, 100% { background-position: 0% 50%; } - 50% { background-position: 100% 50%; } -} - -.refresh-btn::before { - content: ''; - position: absolute; - top: 50%; - left: 50%; - width: 0; - height: 0; - background: rgba(255, 255, 255, 0.3); - border-radius: 50%; - transform: translate(-50%, -50%); - transition: all 0.6s ease; -} - -.refresh-btn:hover::before { - width: 300px; - height: 300px; -} - -.refresh-btn:hover { - transform: translateY(-4px) scale(1.05); - box-shadow: 0 10px 30px rgba(255, 107, 107, 0.5); -} - -.btn-icon { - font-size: 1.3em; - transition: transform 0.4s ease; -} - -.refresh-btn:hover .btn-icon { - transform: rotate(360deg); -} - -/* 彩虹加载动画 */ -.loading { - text-align: center; - padding: 70px 40px; - background: rgba(255, 255, 255, 0.95); - border-radius: 25px; - margin-bottom: 25px; - box-shadow: 0 10px 40px rgba(0, 0, 0, 0.1); - backdrop-filter: blur(20px); -} - -.loading-content { - display: flex; - flex-direction: column; - align-items: center; - gap: 25px; -} - -.rainbow-spinner { - width: 60px; - height: 60px; - border: 6px solid transparent; - border-radius: 50%; - background: linear-gradient(45deg, #ff6b6b, #4ecdc4, #45b7d1, #96ceb4, #feca57, #ff9ff3) border-box; - background-clip: padding-box; - position: relative; - animation: rainbowSpin 2s linear infinite; -} - -.rainbow-spinner::before { - content: ''; - position: absolute; - top: -6px; - left: -6px; - right: -6px; - bottom: -6px; - background: linear-gradient(45deg, #ff6b6b, #4ecdc4, #45b7d1, #96ceb4, #feca57, #ff9ff3); - border-radius: 50%; - z-index: -1; - animation: rainbowSpin 2s linear infinite reverse; -} - -@keyframes rainbowSpin { - 0% { transform: rotate(0deg); filter: hue-rotate(0deg); } - 100% { transform: rotate(360deg); filter: hue-rotate(360deg); } -} - -.loading-text { - display: flex; - flex-direction: column; - align-items: center; - gap: 15px; -} - -.loading-emoji { - font-size: 3em; - animation: rocketPulse 1.5s ease-in-out infinite alternate; -} - -@keyframes rocketPulse { - 0% { transform: scale(1) rotate(-10deg); } - 100% { transform: scale(1.2) rotate(10deg); } -} - -.loading-text p { - font-size: 1.2em; - color: #34495e; - font-weight: 600; - margin: 0; -} - -.loading-dots { - display: flex; - gap: 8px; -} - -.loading-dots span { - width: 10px; - height: 10px; - border-radius: 50%; - animation: dotRainbow 1.4s ease-in-out infinite both; -} - -.loading-dots span:nth-child(1) { - background: #ff6b6b; - animation-delay: -0.32s; -} -.loading-dots span:nth-child(2) { - background: #4ecdc4; - animation-delay: -0.16s; -} -.loading-dots span:nth-child(3) { - background: #45b7d1; - animation-delay: 0s; -} - -@keyframes dotRainbow { - 0%, 80%, 100% { transform: scale(0.8); opacity: 0.5; } - 40% { transform: scale(1.3); opacity: 1; } -} - -/* 新闻列表 */ -.news-list { - display: grid; - gap: 25px; - animation: listFadeIn 0.8s ease-out; -} - -@keyframes listFadeIn { - from { - opacity: 0; - transform: translateY(40px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -.news-item { - background: rgba(255, 255, 255, 0.98); - border-radius: 20px; - padding: 30px; - box-shadow: 0 5px 25px rgba(0, 0, 0, 0.08); - transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94); - border: 2px solid transparent; - backdrop-filter: blur(15px); - position: relative; - overflow: hidden; - animation: itemSlideIn 0.6s ease-out; - animation-fill-mode: both; -} - -.news-item:nth-child(odd) { - animation-delay: 0.1s; -} - -.news-item:nth-child(even) { - animation-delay: 0.2s; -} - -@keyframes itemSlideIn { - from { - opacity: 0; - transform: translateX(-60px); - } - to { - opacity: 1; - transform: translateX(0); - } -} - -.news-item::before { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 6px; - height: 100%; - background: linear-gradient(to bottom, #ff6b6b, #4ecdc4, #45b7d1); - transform: scaleY(0); - transition: transform 0.4s ease; -} - -.news-item:hover::before { - transform: scaleY(1); -} - -.news-item:hover { - box-shadow: 0 10px 50px rgba(0, 0, 0, 0.12); - transform: translateY(-8px) scale(1.02); - border-color: rgba(255, 107, 107, 0.3); -} - -.news-header { - display: flex; - align-items: center; - margin-bottom: 20px; - gap: 15px; -} - -.news-rank { - background: linear-gradient(135deg, #ff6b6b, #4ecdc4); - color: white; - min-width: 45px; - height: 45px; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - font-weight: bold; - font-size: 1.1em; - flex-shrink: 0; - position: relative; - box-shadow: 0 4px 15px rgba(255, 107, 107, 0.3); - animation: rankGlow 3s ease-in-out infinite; -} - -@keyframes rankGlow { - 0%, 100% { - box-shadow: 0 4px 15px rgba(255, 107, 107, 0.3); - background: linear-gradient(135deg, #ff6b6b, #4ecdc4); - } - 33% { - box-shadow: 0 4px 20px rgba(78, 205, 196, 0.4); - background: linear-gradient(135deg, #4ecdc4, #45b7d1); - } - 66% { - box-shadow: 0 4px 20px rgba(69, 183, 209, 0.4); - background: linear-gradient(135deg, #45b7d1, #96ceb4); - } -} - -.news-rank.top-5 { - background: linear-gradient(135deg, #feca57, #ff9ff3, #54a0ff); - animation: topRankGlow 2s ease-in-out infinite alternate; -} - -@keyframes topRankGlow { - 0% { - box-shadow: 0 4px 20px rgba(254, 202, 87, 0.5); - transform: scale(1); - } - 100% { - box-shadow: 0 6px 30px rgba(255, 159, 243, 0.6), 0 0 40px rgba(84, 160, 255, 0.3); - transform: scale(1.05); - } -} - -.news-rank.top-5::before { - content: '⭐'; - position: absolute; - top: -10px; - right: -8px; - font-size: 0.8em; - animation: starTwinkle 1s ease-in-out infinite alternate; -} - -@keyframes starTwinkle { - 0% { transform: translateY(0) rotate(-10deg) scale(1); } - 100% { transform: translateY(-3px) rotate(10deg) scale(1.1); } -} - -.news-score { - background: linear-gradient(135deg, #ff6b6b, #feca57); - color: white; - padding: 8px 16px; - border-radius: 20px; - font-weight: 700; - font-size: 1em; - box-shadow: 0 3px 10px rgba(255, 107, 107, 0.3); - animation: scoreFloat 2s ease-in-out infinite alternate; -} - -@keyframes scoreFloat { - 0% { transform: translateY(0); } - 100% { transform: translateY(-2px); } -} - -.news-title { - font-size: 1.3em; - font-weight: 700; - color: #2c3e50; - line-height: 1.4; - margin-bottom: 15px; - position: relative; -} - -.news-meta { - display: flex; - align-items: center; - gap: 20px; - margin-bottom: 15px; - flex-wrap: wrap; -} - -.news-author { - color: #7f8c8d; - font-size: 1em; - font-weight: 600; - display: flex; - align-items: center; - gap: 6px; -} - -.news-author::before { - content: '👤'; - font-size: 1.1em; -} - -.news-time { - color: #95a5a6; - font-size: 0.95em; - display: flex; - align-items: center; - gap: 6px; -} - -.news-time::before { - content: '🕒'; - font-size: 1em; -} - -.news-link { - display: inline-flex; - align-items: center; - gap: 8px; - color: white; - text-decoration: none; - font-size: 1em; - font-weight: 600; - padding: 12px 24px; - background: linear-gradient(135deg, #ff6b6b, #4ecdc4); - background-size: 200% 200%; - border-radius: 30px; - transition: all 0.4s ease; - position: relative; - overflow: hidden; - animation: linkRainbow 4s ease-in-out infinite; - box-shadow: 0 4px 15px rgba(255, 107, 107, 0.3); -} - -@keyframes linkRainbow { - 0%, 100% { background-position: 0% 50%; } - 50% { background-position: 100% 50%; } -} - -.news-link::before { - content: '🚀'; - font-size: 1.1em; -} - -.news-link::after { - content: ''; - position: absolute; - top: 0; - left: -100%; - width: 100%; - height: 100%; - background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent); - transition: left 0.6s ease; -} - -.news-link:hover::after { - left: 100%; -} - -.news-link:hover { - transform: scale(1.05) translateY(-2px); - box-shadow: 0 8px 25px rgba(255, 107, 107, 0.5); -} - -/* 错误信息 */ -.error-message { - text-align: center; - padding: 70px 40px; - background: rgba(255, 255, 255, 0.95); - border-radius: 25px; - box-shadow: 0 10px 40px rgba(231, 76, 60, 0.1); - backdrop-filter: blur(20px); -} - -.error-content { - display: flex; - flex-direction: column; - align-items: center; - gap: 25px; -} - -.error-icon { - font-size: 5em; - animation: errorShake 1.5s ease-in-out infinite alternate; -} - -@keyframes errorShake { - 0% { transform: translateX(0) rotate(0deg); } - 25% { transform: translateX(-8px) rotate(-8deg); } - 50% { transform: translateX(8px) rotate(8deg); } - 75% { transform: translateX(-5px) rotate(-5deg); } - 100% { transform: translateX(0) rotate(0deg); } -} - -.error-content h3 { - font-size: 1.8em; - color: #e74c3c; - margin: 0; - font-weight: 700; -} - -.error-content p { - color: #7f8c8d; - font-size: 1.1em; - margin: 0; - line-height: 1.6; -} - -.retry-btn { - background: linear-gradient(135deg, #ff6b6b, #4ecdc4); - color: white; - border: none; - padding: 15px 30px; - border-radius: 30px; - cursor: pointer; - font-size: 1.1em; - font-weight: 700; - transition: all 0.4s ease; - box-shadow: 0 6px 20px rgba(255, 107, 107, 0.3); - display: inline-flex; - align-items: center; - gap: 10px; -} - -.retry-btn:hover { - background: linear-gradient(135deg, #e74c3c, #3498db); - box-shadow: 0 8px 25px rgba(255, 107, 107, 0.5); - transform: translateY(-3px); -} - -.retry-btn span { - font-size: 1.2em; - transition: transform 0.4s ease; -} - -.retry-btn:hover span { - transform: rotate(360deg); -} - -/* 平板端适配 (768px - 1024px) */ -@media (min-width: 768px) and (max-width: 1024px) { - .container { - padding: 25px; - } - - .header { - padding: 35px 25px; - } - - .header-icon { - font-size: 3.5em; - } - - .title { - font-size: 2.8em; - letter-spacing: 1.5px; - } - - .subtitle { - font-size: 1.2em; - } - - .news-list { - grid-template-columns: repeat(auto-fit, minmax(450px, 1fr)); - gap: 30px; - } - - .news-item { - padding: 25px; - } - - .news-rank { - min-width: 42px; - height: 42px; - font-size: 1.05em; - } - - .news-title { - font-size: 1.25em; - } - - .tab-container { - gap: 12px; - } - - .tab-btn { - padding: 10px 20px; - font-size: 0.95em; - } -} - -/* 电脑端适配 (1025px+) */ -@media (min-width: 1025px) { - .container { - padding: 40px; - } - - .header { - padding: 50px 40px; - margin-bottom: 50px; - } - - .header-icon { - font-size: 4.5em; - } - - .title { - font-size: 3.8em; - letter-spacing: 3px; - } - - .subtitle { - font-size: 1.4em; - } - - .news-list { - grid-template-columns: repeat(auto-fit, minmax(550px, 1fr)); - gap: 35px; - } - - .news-item { - padding: 35px; - } - - .news-rank { - min-width: 50px; - height: 50px; - font-size: 1.2em; - } - - .news-title { - font-size: 1.4em; - } - - .news-meta { - gap: 25px; - } - - .news-author { - font-size: 1.05em; - } - - .news-time { - font-size: 1em; - } - - .news-link { - font-size: 1.05em; - padding: 14px 28px; - } - - /* 电脑端特殊效果 */ - .news-item:hover { - transform: translateY(-10px) scale(1.03); - } - - .tab-btn { - padding: 14px 28px; - font-size: 1.05em; - } -} - -/* 手机端适配 (767px以下) */ -@media (max-width: 767px) { - .container { - padding: 15px; - } - - .header { - padding: 25px 20px; - margin-bottom: 25px; - } - - .header-icon { - font-size: 2.8em; - } - - .title { - font-size: 2.2em; - letter-spacing: 1px; - } - - .subtitle { - font-size: 1em; - } - - .tab-container { - gap: 8px; - justify-content: center; - } - - .tab-btn { - padding: 8px 16px; - font-size: 0.85em; - flex-direction: column; - gap: 4px; - } - - .update-time { - font-size: 0.9em; - padding: 8px 16px; - } - - .refresh-btn { - padding: 12px 24px; - font-size: 0.95em; - } - - .news-item { - padding: 20px; - border-radius: 15px; - } - - .news-rank { - min-width: 38px; - height: 38px; - font-size: 0.95em; - } - - .news-title { - font-size: 1.15em; - line-height: 1.3; - } - - .news-meta { - flex-direction: column; - align-items: flex-start; - gap: 10px; - } - - .news-author { - font-size: 0.9em; - } - - .news-time { - font-size: 0.85em; - } - - .news-link { - font-size: 0.9em; - padding: 10px 20px; - align-self: flex-start; - } - - /* 手机端动画优化 */ - .news-item { - animation-duration: 0.4s; - } - - .news-item:hover { - transform: translateY(-3px) scale(1.01); - } -} - -/* 超小屏幕适配 (480px以下) */ -@media (max-width: 480px) { - .container { - padding: 12px; - } - - .header { - padding: 20px 15px; - margin-bottom: 20px; - } - - .header-icon { - font-size: 2.5em; - } - - .title { - font-size: 1.9em; - letter-spacing: 0.5px; - } - - .subtitle { - font-size: 0.95em; - } - - .tab-container { - gap: 6px; - } - - .tab-btn { - padding: 6px 12px; - font-size: 0.8em; - min-width: auto; - } - - .tab-icon { - font-size: 1em; - } - - .update-time { - font-size: 0.85em; - padding: 6px 12px; - flex-direction: column; - gap: 4px; - } - - .refresh-btn { - padding: 10px 20px; - font-size: 0.9em; - } - - .news-list { - gap: 15px; - } - - .news-item { - padding: 18px 15px; - border-radius: 12px; - } - - .news-header { - gap: 12px; - margin-bottom: 15px; - } - - .news-rank { - min-width: 35px; - height: 35px; - font-size: 0.9em; - } - - .news-title { - font-size: 1.05em; - line-height: 1.25; - } - - .news-meta { - gap: 8px; - } - - .news-author { - font-size: 0.85em; - } - - .news-time { - font-size: 0.8em; - } - - .news-link { - font-size: 0.85em; - padding: 8px 16px; - } - - /* 超小屏幕性能优化 */ - .news-item { - transition: transform 0.2s ease, box-shadow 0.2s ease; - } - - .news-item::before, - .news-item::after, - .news-link::after { - display: none; - } - - .loading-content { - gap: 15px; - } - - .loading-emoji { - font-size: 2.5em; - } - - .error-icon { - font-size: 3.5em; - } - - .error-content h3 { - font-size: 1.4em; - } - - .error-content p { - font-size: 0.95em; - } -} diff --git a/frontend/react-app/public/60sapi/热搜榜单/HackerNews榜单/index.html b/frontend/react-app/public/60sapi/热搜榜单/HackerNews榜单/index.html deleted file mode 100644 index 765583af..00000000 --- a/frontend/react-app/public/60sapi/热搜榜单/HackerNews榜单/index.html +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - 🔥 HackerNews 热门榜单 - - - - -
    -
    -
    🌈
    -

    🔥 HackerNews 热门榜单 💻

    -

    全球技术社区 · 实时热门话题

    - -
    - - - -
    - -
    - - 加载中... -
    - - -
    - -
    -
    -
    -
    - 🚀 -

    正在获取最新榜单...

    -
    - - - -
    -
    -
    -
    - -
    - -
    - - -
    - - - - diff --git a/frontend/react-app/public/60sapi/热搜榜单/HackerNews榜单/js/script.js b/frontend/react-app/public/60sapi/热搜榜单/HackerNews榜单/js/script.js deleted file mode 100644 index 33d90bed..00000000 --- a/frontend/react-app/public/60sapi/热搜榜单/HackerNews榜单/js/script.js +++ /dev/null @@ -1,338 +0,0 @@ -// API接口列表 -const API_ENDPOINTS = [ - "https://60s-cf.viki.moe", - "https://60s.viki.moe", - "https://60s.b23.run", - "https://60s.114128.xyz", - "https://60s-cf.114128.xyz" -]; - -// 当前使用的API索引 -let currentApiIndex = 0; -let currentType = 'top'; - -// DOM元素 -const loadingElement = document.getElementById('loading'); -const newsListElement = document.getElementById('newsList'); -const errorMessageElement = document.getElementById('errorMessage'); -const updateTimeElement = document.getElementById('updateTime'); -const refreshBtn = document.getElementById('refreshBtn'); -const tabBtns = document.querySelectorAll('.tab-btn'); - -// 页面加载完成后自动加载数据 -document.addEventListener('DOMContentLoaded', function() { - loadNewsList(); - initTabEvents(); -}); - -// 初始化标签事件 -function initTabEvents() { - tabBtns.forEach(btn => { - btn.addEventListener('click', function() { - const type = this.getAttribute('data-type'); - if (type !== currentType) { - currentType = type; - updateActiveTab(this); - loadNewsList(); - } - }); - }); -} - -// 更新活跃标签 -function updateActiveTab(activeBtn) { - tabBtns.forEach(btn => btn.classList.remove('active')); - activeBtn.classList.add('active'); -} - -// 刷新按钮点击事件 -refreshBtn.addEventListener('click', function() { - loadNewsList(); -}); - -// 加载新闻列表 -async function loadNewsList() { - showLoading(); - hideError(); - - try { - const data = await fetchData(); - displayNewsList(data.data); - updateRefreshTime(); - } catch (error) { - console.error('加载失败:', error); - showError(); - } - - hideLoading(); -} - -// 获取数据 -async function fetchData() { - for (let i = 0; i < API_ENDPOINTS.length; i++) { - const apiUrl = API_ENDPOINTS[currentApiIndex]; - - try { - const response = await fetch(`${apiUrl}/v2/hacker-news/${currentType}`, { - method: 'GET', - headers: { - 'Accept': 'application/json', - }, - timeout: 10000 - }); - - if (!response.ok) { - throw new Error(`HTTP ${response.status}`); - } - - const data = await response.json(); - - if (data.code === 200 && data.data) { - return data; - } else { - throw new Error('数据格式错误'); - } - } catch (error) { - console.error(`API ${apiUrl} 请求失败:`, error); - currentApiIndex = (currentApiIndex + 1) % API_ENDPOINTS.length; - - if (i === API_ENDPOINTS.length - 1) { - throw new Error('所有API接口都无法访问'); - } - } - } -} - -// 显示新闻列表 -function displayNewsList(newsData) { - newsListElement.innerHTML = ''; - - newsData.forEach((item, index) => { - const newsItem = createNewsItem(item, index + 1); - newsListElement.appendChild(newsItem); - }); -} - -// 创建新闻项目 -function createNewsItem(item, rank) { - const newsItem = document.createElement('div'); - newsItem.className = 'news-item'; - - const rankClass = rank <= 5 ? 'news-rank top-5' : 'news-rank'; - const formattedScore = formatScore(item.score); - const formattedTime = formatTime(item.created); - - // 根据排名添加特殊标识 - let rankEmoji = ''; - if (rank === 1) rankEmoji = '🏆'; - else if (rank === 2) rankEmoji = '🥈'; - else if (rank === 3) rankEmoji = '🥉'; - else if (rank <= 10) rankEmoji = '💎'; - else rankEmoji = '⭐'; - - // 根据评分添加热度指示 - let heatLevel = ''; - if (item.score >= 1000) heatLevel = '🔥🔥🔥'; - else if (item.score >= 500) heatLevel = '🔥🔥'; - else if (item.score >= 100) heatLevel = '🔥'; - else heatLevel = '💫'; - - newsItem.innerHTML = ` -
    -
    ${rank}
    -
    ${heatLevel} ${formattedScore}
    -
    -
    ${rankEmoji} ${escapeHtml(item.title)}
    -
    -
    👤 ${escapeHtml(item.author)}
    -
    🕒 ${formattedTime}
    -
    - - 🚀 阅读全文 - - `; - - return newsItem; -} - -// 格式化评分 -function formatScore(score) { - if (score >= 1000) { - return (score / 1000).toFixed(1) + 'K'; - } else { - return score.toString(); - } -} - -// 格式化时间 -function formatTime(timeStr) { - try { - const date = new Date(timeStr); - const now = new Date(); - const diff = now - date; - const minutes = Math.floor(diff / (1000 * 60)); - const hours = Math.floor(minutes / 60); - const days = Math.floor(hours / 24); - - if (days > 0) { - return `${days}天前`; - } else if (hours > 0) { - return `${hours}小时前`; - } else if (minutes > 0) { - return `${minutes}分钟前`; - } else { - return '刚刚'; - } - } catch (error) { - return timeStr; - } -} - -// HTML转义 -function escapeHtml(text) { - const div = document.createElement('div'); - div.textContent = text; - return div.innerHTML; -} - -// 更新刷新时间 -function updateRefreshTime() { - const now = new Date(); - const timeStr = now.toLocaleString('zh-CN', { - year: 'numeric', - month: '2-digit', - day: '2-digit', - hour: '2-digit', - minute: '2-digit', - second: '2-digit' - }); - updateTimeElement.textContent = `最后更新: ${timeStr}`; - - // 添加成功提示 - showSuccessMessage('🌈 数据已更新'); -} - -// 显示成功消息 -function showSuccessMessage(message) { - // 移除之前的提示 - const existingToast = document.querySelector('.success-toast'); - if (existingToast) { - existingToast.remove(); - } - - const toast = document.createElement('div'); - toast.className = 'success-toast'; - toast.textContent = message; - toast.style.cssText = ` - position: fixed; - top: 20px; - right: 20px; - background: linear-gradient(135deg, #ff6b6b, #4ecdc4, #45b7d1); - color: white; - padding: 12px 20px; - border-radius: 25px; - box-shadow: 0 4px 20px rgba(255, 107, 107, 0.3); - z-index: 1000; - font-weight: 600; - font-size: 0.9em; - animation: rainbowToastSlide 0.5s ease-out; - backdrop-filter: blur(10px); - `; - - document.body.appendChild(toast); - - // 3秒后自动移除 - setTimeout(() => { - toast.style.animation = 'rainbowToastSlideOut 0.5s ease-in forwards'; - setTimeout(() => toast.remove(), 500); - }, 3000); -} - -// 显示加载状态 -function showLoading() { - loadingElement.style.display = 'block'; - newsListElement.style.display = 'none'; -} - -// 隐藏加载状态 -function hideLoading() { - loadingElement.style.display = 'none'; - newsListElement.style.display = 'block'; -} - -// 显示错误信息 -function showError() { - errorMessageElement.style.display = 'block'; - newsListElement.style.display = 'none'; -} - -// 隐藏错误信息 -function hideError() { - errorMessageElement.style.display = 'none'; -} - -// 添加CSS动画到页面 -if (!document.querySelector('#toast-styles')) { - const style = document.createElement('style'); - style.id = 'toast-styles'; - style.textContent = ` - @keyframes rainbowToastSlide { - from { - opacity: 0; - transform: translateX(100px) scale(0.8); - } - to { - opacity: 1; - transform: translateX(0) scale(1); - } - } - - @keyframes rainbowToastSlideOut { - from { - opacity: 1; - transform: translateX(0) scale(1); - } - to { - opacity: 0; - transform: translateX(100px) scale(0.8); - } - } - - .success-toast { - background-size: 200% 200%; - animation: rainbowToastSlide 0.5s ease-out, toastRainbow 2s ease-in-out infinite !important; - } - - @keyframes toastRainbow { - 0%, 100% { background-position: 0% 50%; } - 50% { background-position: 100% 50%; } - } - `; - document.head.appendChild(style); -} - -// 自动刷新 (每5分钟) -setInterval(function() { - loadNewsList(); -}, 5 * 60 * 1000); - -// 键盘快捷键支持 -document.addEventListener('keydown', function(e) { - if (e.key === 'r' && (e.ctrlKey || e.metaKey)) { - e.preventDefault(); - loadNewsList(); - } - - // 数字键切换标签 - if (e.key >= '1' && e.key <= '3') { - e.preventDefault(); - const typeMap = { '1': 'top', '2': 'new', '3': 'best' }; - const targetType = typeMap[e.key]; - const targetBtn = document.querySelector(`[data-type="${targetType}"]`); - if (targetBtn && targetType !== currentType) { - currentType = targetType; - updateActiveTab(targetBtn); - loadNewsList(); - } - } -}); diff --git a/frontend/react-app/public/60sapi/热搜榜单/HackerNews榜单/接口集合.json b/frontend/react-app/public/60sapi/热搜榜单/HackerNews榜单/接口集合.json deleted file mode 100644 index 04e92b7f..00000000 --- a/frontend/react-app/public/60sapi/热搜榜单/HackerNews榜单/接口集合.json +++ /dev/null @@ -1,7 +0,0 @@ -[ - "https://60s-cf.viki.moe", - "https://60s.viki.moe", - "https://60s.b23.run", - "https://60s.114128.xyz", - "https://60s-cf.114128.xyz" -] diff --git a/frontend/react-app/public/60sapi/热搜榜单/HackerNews榜单/返回接口.json b/frontend/react-app/public/60sapi/热搜榜单/HackerNews榜单/返回接口.json deleted file mode 100644 index 0008f691..00000000 --- a/frontend/react-app/public/60sapi/热搜榜单/HackerNews榜单/返回接口.json +++ /dev/null @@ -1,87 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": [ - { - "id": 45087396, - "title": "We should have the ability to run any code we want on hardware we own", - "link": "https://hugotunius.se/2025/08/31/what-every-argument-about-sideloading-gets-wrong.html", - "score": 995, - "author": "K0nserv", - "created": "2025-08-31 21:46:26", - "created_at": 1756676786000 - }, - { - "id": 45053029, - "title": "Why countries trade with each other while fighting", - "link": "https://news.mit.edu/2025/why-countries-trade-each-other-while-fighting-mariya-grinberg-book-0828", - "score": 32, - "author": "LorenDB", - "created": "2025-08-28 14:58:28", - "created_at": 1756393108000 - }, - { - "id": 45086020, - "title": "Eternal Struggle", - "link": "https://yoavg.github.io/eternal/", - "score": 481, - "author": "yurivish", - "created": "2025-08-31 19:04:03", - "created_at": 1756667043000 - }, - { - "id": 45052960, - "title": "C++: Strongly Happens Before?", - "link": "https://nekrozqliphort.github.io/posts/happens-b4/", - "score": 16, - "author": "signa11", - "created": "2025-08-28 14:54:37", - "created_at": 1756392877000 - }, - { - "id": 45087971, - "title": "Nintendo Switch 2 Dock USB-C Compatibility", - "link": "https://www.lttlabs.com/blog/2025/08/30/nintendo-switch-2-dock", - "score": 192, - "author": "croes", - "created": "2025-08-31 23:21:46", - "created_at": 1756682506000 - }, - { - "id": 45082731, - "title": "“This telegram must be closely paraphrased before being communicated to anyone”", - "link": "https://history.stackexchange.com/questions/79371/this-telegram-must-be-closely-paraphrased-before-being-communicated-to-anyone", - "score": 645, - "author": "azeemba", - "created": "2025-08-31 12:39:47", - "created_at": 1756643987000 - }, - { - "id": 45089256, - "title": "What Is Complexity in Chess?", - "link": "https://lichess.org/@/Toadofsky/blog/what-is-complexity/pKo1swFh", - "score": 41, - "author": "fzliu", - "created": "2025-09-01 03:45:33", - "created_at": 1756698333000 - }, - { - "id": 45087815, - "title": "Lewis and Clark marked their trail with laxatives", - "link": "https://offbeatoregon.com/2501d1006d_biliousPills-686.077.html", - "score": 141, - "author": "toomuchtodo", - "created": "2025-08-31 22:54:26", - "created_at": 1756680866000 - }, - { - "id": 45083952, - "title": "Jujutsu for everyone", - "link": "https://jj-for-everyone.github.io/", - "score": 363, - "author": "Bogdanp", - "created": "2025-08-31 15:31:04", - "created_at": 1756654264000 - } - ] -} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/热搜榜单/微博热搜榜/css/background.css b/frontend/react-app/public/60sapi/热搜榜单/微博热搜榜/css/background.css deleted file mode 100644 index 91b3ee72..00000000 --- a/frontend/react-app/public/60sapi/热搜榜单/微博热搜榜/css/background.css +++ /dev/null @@ -1,40 +0,0 @@ -.background-container { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: -1; - overflow: hidden; -} - -.rainbow-gradient { - position: absolute; - top: -50%; - left: -50%; - width: 200%; - height: 200%; - background: linear-gradient( - 217deg, - rgba(255, 0, 0, 0.6), - rgba(255, 0, 0, 0) 70.71% - ), linear-gradient( - 127deg, - rgba(0, 255, 0, 0.6), - rgba(0, 255, 0, 0) 70.71% - ), linear-gradient( - 336deg, - rgba(0, 0, 255, 0.6), - rgba(0, 0, 255, 0) 70.71% - ); - animation: rainbow-rotate 15s linear infinite; -} - -@keyframes rainbow-rotate { - 0% { - transform: rotate(0deg); - } - 100% { - transform: rotate(360deg); - } -} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/热搜榜单/微博热搜榜/css/style.css b/frontend/react-app/public/60sapi/热搜榜单/微博热搜榜/css/style.css deleted file mode 100644 index b7d33692..00000000 --- a/frontend/react-app/public/60sapi/热搜榜单/微博热搜榜/css/style.css +++ /dev/null @@ -1,155 +0,0 @@ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: 'PingFang SC', 'Microsoft YaHei', sans-serif; - color: #333; - background-color: #f5f5f5; - position: relative; - min-height: 100vh; -} - -.container { - max-width: 800px; - margin: 0 auto; - padding: 20px; - position: relative; - z-index: 1; - background-color: rgba(255, 255, 255, 0.85); - border-radius: 10px; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); -} - -header { - text-align: center; - margin-bottom: 20px; - padding-bottom: 15px; - border-bottom: 1px solid #eaeaea; -} - -header h1 { - color: #07a35a; - margin-bottom: 10px; - font-size: 2rem; -} - -.update-time { - color: #888; - font-size: 0.9rem; -} - -.hot-list { - list-style: none; -} - -.hot-item { - padding: 15px; - margin-bottom: 10px; - border-radius: 8px; - background-color: white; - box-shadow: 0 2px 6px rgba(0, 0, 0, 0.05); - transition: transform 0.2s, box-shadow 0.2s; - display: flex; - align-items: center; -} - -.hot-item:hover { - transform: translateY(-2px); - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); -} - -.hot-rank { - font-size: 1.2rem; - font-weight: bold; - color: #ff8200; - margin-right: 15px; - min-width: 30px; - text-align: center; -} - -.hot-rank.top-1 { - color: #ff4500; -} - -.hot-rank.top-2, .hot-rank.top-3 { - color: #ff6600; -} - -.hot-content { - flex: 1; -} - -.hot-title { - font-size: 1.1rem; - margin-bottom: 5px; - color: #333; - text-decoration: none; - display: block; -} - -.hot-title:hover { - color: #07a35a; -} - -.hot-value { - font-size: 0.85rem; - color: #888; -} - -.loading { - text-align: center; - padding: 20px; - color: #888; -} - -footer { - text-align: center; - margin-top: 30px; - padding-top: 15px; - border-top: 1px solid #eaeaea; - color: #888; - font-size: 0.9rem; -} - -/* 响应式设计 */ -/* 手机端 */ -@media (max-width: 576px) { - .container { - padding: 15px; - margin: 10px; - } - - header h1 { - font-size: 1.5rem; - } - - .hot-item { - padding: 12px; - } - - .hot-rank { - font-size: 1rem; - min-width: 25px; - margin-right: 10px; - } - - .hot-title { - font-size: 1rem; - } -} - -/* 平板端 */ -@media (min-width: 577px) and (max-width: 992px) { - .container { - max-width: 90%; - } - - header h1 { - font-size: 1.8rem; - } -} - -/* 电脑端 - 默认样式已经设置 */ \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/热搜榜单/微博热搜榜/index.html b/frontend/react-app/public/60sapi/热搜榜单/微博热搜榜/index.html deleted file mode 100644 index 0cb32410..00000000 --- a/frontend/react-app/public/60sapi/热搜榜单/微博热搜榜/index.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - 微博热搜榜 - - - - -
    -
    -
    - -
    -
    -

    微博热搜榜

    -
    -
    - -
    -
    -
    加载中...
    -
    -
    - -
    -

    数据来源于微博热搜榜

    -
    -
    - - - - \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/热搜榜单/微博热搜榜/js/main.js b/frontend/react-app/public/60sapi/热搜榜单/微博热搜榜/js/main.js deleted file mode 100644 index 8a5e3bd4..00000000 --- a/frontend/react-app/public/60sapi/热搜榜单/微博热搜榜/js/main.js +++ /dev/null @@ -1,94 +0,0 @@ -// API接口列表 -const API_ENDPOINTS = [ - "https://60s-cf.viki.moe/v2/weibo", - "https://60s.viki.moe/v2/weibo", - "https://60s.b23.run/v2/weibo", - "https://60s.114128.xyz/v2/weibo", - "https://60s-cf.114128.xyz/v2/weibo" -]; - -// 当前使用的API索引 -let currentApiIndex = 0; - -// DOM元素 -const hotListElement = document.getElementById('hotList'); -const updateTimeElement = document.getElementById('updateTime'); - -// 格式化时间 -function formatDate(date) { - const year = date.getFullYear(); - const month = String(date.getMonth() + 1).padStart(2, '0'); - const day = String(date.getDate()).padStart(2, '0'); - const hours = String(date.getHours()).padStart(2, '0'); - const minutes = String(date.getMinutes()).padStart(2, '0'); - const seconds = String(date.getSeconds()).padStart(2, '0'); - - return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; -} - -// 渲染热搜列表 -function renderHotList(data) { - hotListElement.innerHTML = ''; - - data.forEach((item, index) => { - const hotItem = document.createElement('div'); - hotItem.className = 'hot-item'; - - const rankClass = index < 3 ? `top-${index + 1}` : ''; - - hotItem.innerHTML = ` -
    ${index + 1}
    -
    - ${item.title} - ${item.hot_value ? `
    ${item.hot_value}
    ` : ''} -
    - `; - - hotListElement.appendChild(hotItem); - }); - - // 更新时间 - updateTimeElement.textContent = `更新时间:${formatDate(new Date())}`; -} - -// 获取微博热搜数据 -async function fetchWeiboHotList() { - try { - const response = await fetch(API_ENDPOINTS[currentApiIndex]); - - if (!response.ok) { - throw new Error('网络响应不正常'); - } - - const result = await response.json(); - - if (result.code === 200 && result.data) { - renderHotList(result.data); - } else { - throw new Error('数据格式错误'); - } - } catch (error) { - console.error('获取数据失败:', error); - - // 尝试切换到下一个API - currentApiIndex = (currentApiIndex + 1) % API_ENDPOINTS.length; - - // 显示错误信息 - hotListElement.innerHTML = ` -
    - 获取数据失败,正在尝试其他接口... -
    - `; - - // 延迟后重试 - setTimeout(fetchWeiboHotList, 2000); - } -} - -// 页面加载完成后获取数据 -document.addEventListener('DOMContentLoaded', () => { - fetchWeiboHotList(); - - // 每隔5分钟刷新一次数据 - setInterval(fetchWeiboHotList, 5 * 60 * 1000); -}); \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/热搜榜单/微博热搜榜/接口集合.json b/frontend/react-app/public/60sapi/热搜榜单/微博热搜榜/接口集合.json deleted file mode 100644 index 04e92b7f..00000000 --- a/frontend/react-app/public/60sapi/热搜榜单/微博热搜榜/接口集合.json +++ /dev/null @@ -1,7 +0,0 @@ -[ - "https://60s-cf.viki.moe", - "https://60s.viki.moe", - "https://60s.b23.run", - "https://60s.114128.xyz", - "https://60s-cf.114128.xyz" -] diff --git a/frontend/react-app/public/60sapi/热搜榜单/微博热搜榜/返回接口.json b/frontend/react-app/public/60sapi/热搜榜单/微博热搜榜/返回接口.json deleted file mode 100644 index 0779a075..00000000 --- a/frontend/react-app/public/60sapi/热搜榜单/微博热搜榜/返回接口.json +++ /dev/null @@ -1,261 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": [ - { - "title": "00后男生0.6秒飞针采血惊呆患者", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=00%E5%90%8E%E7%94%B7%E7%94%9F0.6%E7%A7%92%E9%A3%9E%E9%92%88%E9%87%87%E8%A1%80%E6%83%8A%E5%91%86%E6%82%A3%E8%80%85" - }, - { - "title": "普京带3位副总理10多位部长到中国", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E6%99%AE%E4%BA%AC%E5%B8%A63%E4%BD%8D%E5%89%AF%E6%80%BB%E7%90%8610%E5%A4%9A%E4%BD%8D%E9%83%A8%E9%95%BF%E5%88%B0%E4%B8%AD%E5%9B%BD" - }, - { - "title": "始终高举上海精神旗帜", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%A7%8B%E7%BB%88%E9%AB%98%E4%B8%BE%E4%B8%8A%E6%B5%B7%E7%B2%BE%E7%A5%9E%E6%97%97%E5%B8%9C" - }, - { - "title": "女生苦练化妆1年的变化", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%A5%B3%E7%94%9F%E8%8B%A6%E7%BB%83%E5%8C%96%E5%A6%861%E5%B9%B4%E7%9A%84%E5%8F%98%E5%8C%96" - }, - { - "title": "香港1200架无人机重现日本投降矣", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E9%A6%99%E6%B8%AF1200%E6%9E%B6%E6%97%A0%E4%BA%BA%E6%9C%BA%E9%87%8D%E7%8E%B0%E6%97%A5%E6%9C%AC%E6%8A%95%E9%99%8D%E7%9F%A3" - }, - { - "title": "尚公主全阵容官宣", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%B0%9A%E5%85%AC%E4%B8%BB%E5%85%A8%E9%98%B5%E5%AE%B9%E5%AE%98%E5%AE%A3" - }, - { - "title": "真的可以永远相信刘宇舞台", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E7%9C%9F%E7%9A%84%E5%8F%AF%E4%BB%A5%E6%B0%B8%E8%BF%9C%E7%9B%B8%E4%BF%A1%E5%88%98%E5%AE%87%E8%88%9E%E5%8F%B0" - }, - { - "title": "九三阅兵徒步方队铿锵步伐", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E4%B9%9D%E4%B8%89%E9%98%85%E5%85%B5%E5%BE%92%E6%AD%A5%E6%96%B9%E9%98%9F%E9%93%BF%E9%94%B5%E6%AD%A5%E4%BC%90" - }, - { - "title": "唐朝诡事录", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%94%90%E6%9C%9D%E8%AF%A1%E4%BA%8B%E5%BD%95" - }, - { - "title": "抗战胜利80周年第3场记者招待会", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E6%8A%97%E6%88%98%E8%83%9C%E5%88%A980%E5%91%A8%E5%B9%B4%E7%AC%AC3%E5%9C%BA%E8%AE%B0%E8%80%85%E6%8B%9B%E5%BE%85%E4%BC%9A" - }, - { - "title": "王曼昱钱天一3比2蒯曼孙颖莎", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E7%8E%8B%E6%9B%BC%E6%98%B1%E9%92%B1%E5%A4%A9%E4%B8%803%E6%AF%942%E8%92%AF%E6%9B%BC%E5%AD%99%E9%A2%96%E8%8E%8E" - }, - { - "title": "张维伊对96岁的姥姥说长命百岁", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%BC%A0%E7%BB%B4%E4%BC%8A%E5%AF%B996%E5%B2%81%E7%9A%84%E5%A7%A5%E5%A7%A5%E8%AF%B4%E9%95%BF%E5%91%BD%E7%99%BE%E5%B2%81" - }, - { - "title": "孟子义李昀锐定妆照", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%AD%9F%E5%AD%90%E4%B9%89%E6%9D%8E%E6%98%80%E9%94%90%E5%AE%9A%E5%A6%86%E7%85%A7" - }, - { - "title": "以为张艺兴穿的蓝色抹胸", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E4%BB%A5%E4%B8%BA%E5%BC%A0%E8%89%BA%E5%85%B4%E7%A9%BF%E7%9A%84%E8%93%9D%E8%89%B2%E6%8A%B9%E8%83%B8" - }, - { - "title": "尚公主开机", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%B0%9A%E5%85%AC%E4%B8%BB%E5%BC%80%E6%9C%BA" - }, - { - "title": "心动的信号8", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%BF%83%E5%8A%A8%E7%9A%84%E4%BF%A1%E5%8F%B78" - }, - { - "title": "霍建华病娇疯批演爽了", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E9%9C%8D%E5%BB%BA%E5%8D%8E%E7%97%85%E5%A8%87%E7%96%AF%E6%89%B9%E6%BC%94%E7%88%BD%E4%BA%86" - }, - { - "title": "普京抵达天津", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E6%99%AE%E4%BA%AC%E6%8A%B5%E8%BE%BE%E5%A4%A9%E6%B4%A5" - }, - { - "title": "龚俊的体面只给旅游前几天", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E9%BE%9A%E4%BF%8A%E7%9A%84%E4%BD%93%E9%9D%A2%E5%8F%AA%E7%BB%99%E6%97%85%E6%B8%B8%E5%89%8D%E5%87%A0%E5%A4%A9" - }, - { - "title": "开学焦虑更严重的另有其人", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%BC%80%E5%AD%A6%E7%84%A6%E8%99%91%E6%9B%B4%E4%B8%A5%E9%87%8D%E7%9A%84%E5%8F%A6%E6%9C%89%E5%85%B6%E4%BA%BA" - }, - { - "title": "那英小发雷霆", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E9%82%A3%E8%8B%B1%E5%B0%8F%E5%8F%91%E9%9B%B7%E9%9C%86" - }, - { - "title": "居然有演员一句台词背1小时", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%B1%85%E7%84%B6%E6%9C%89%E6%BC%94%E5%91%98%E4%B8%80%E5%8F%A5%E5%8F%B0%E8%AF%8D%E8%83%8C1%E5%B0%8F%E6%97%B6" - }, - { - "title": "谁教魏哲鸣冷脸跳这些的", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E8%B0%81%E6%95%99%E9%AD%8F%E5%93%B2%E9%B8%A3%E5%86%B7%E8%84%B8%E8%B7%B3%E8%BF%99%E4%BA%9B%E7%9A%84" - }, - { - "title": "朱孝天爆冷出局", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E6%9C%B1%E5%AD%9D%E5%A4%A9%E7%88%86%E5%86%B7%E5%87%BA%E5%B1%80" - }, - { - "title": "俄军称掌握战略主动权", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E4%BF%84%E5%86%9B%E7%A7%B0%E6%8E%8C%E6%8F%A1%E6%88%98%E7%95%A5%E4%B8%BB%E5%8A%A8%E6%9D%83" - }, - { - "title": "谈恋爱3个月定律", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E8%B0%88%E6%81%8B%E7%88%B13%E4%B8%AA%E6%9C%88%E5%AE%9A%E5%BE%8B" - }, - { - "title": "沈腾说错了最怕人笨还不勤快", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E6%B2%88%E8%85%BE%E8%AF%B4%E9%94%99%E4%BA%86%E6%9C%80%E6%80%95%E4%BA%BA%E7%AC%A8%E8%BF%98%E4%B8%8D%E5%8B%A4%E5%BF%AB" - }, - { - "title": "王菲最新状态", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E7%8E%8B%E8%8F%B2%E6%9C%80%E6%96%B0%E7%8A%B6%E6%80%81" - }, - { - "title": "张紫宁转行当拉拉队经理人了", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%BC%A0%E7%B4%AB%E5%AE%81%E8%BD%AC%E8%A1%8C%E5%BD%93%E6%8B%89%E6%8B%89%E9%98%9F%E7%BB%8F%E7%90%86%E4%BA%BA%E4%BA%86" - }, - { - "title": "金价大涨两大原因", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E9%87%91%E4%BB%B7%E5%A4%A7%E6%B6%A8%E4%B8%A4%E5%A4%A7%E5%8E%9F%E5%9B%A0" - }, - { - "title": "陕西Shaanxi官方标准拼音", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E9%99%95%E8%A5%BFShaanxi%E5%AE%98%E6%96%B9%E6%A0%87%E5%87%86%E6%8B%BC%E9%9F%B3" - }, - { - "title": "边伯贤跳刀马刀马", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E8%BE%B9%E4%BC%AF%E8%B4%A4%E8%B7%B3%E5%88%80%E9%A9%AC%E5%88%80%E9%A9%AC" - }, - { - "title": "冷冻太久的肉就不要再吃了", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%86%B7%E5%86%BB%E5%A4%AA%E4%B9%85%E7%9A%84%E8%82%89%E5%B0%B1%E4%B8%8D%E8%A6%81%E5%86%8D%E5%90%83%E4%BA%86" - }, - { - "title": "95后00后恋爱有代沟", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=95%E5%90%8E00%E5%90%8E%E6%81%8B%E7%88%B1%E6%9C%89%E4%BB%A3%E6%B2%9F" - }, - { - "title": "易烊千玺抢票", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E6%98%93%E7%83%8A%E5%8D%83%E7%8E%BA%E6%8A%A2%E7%A5%A8" - }, - { - "title": "孙闻被乒协处罚", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%AD%99%E9%97%BB%E8%A2%AB%E4%B9%92%E5%8D%8F%E5%A4%84%E7%BD%9A" - }, - { - "title": "这居然是白举纲", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E8%BF%99%E5%B1%85%E7%84%B6%E6%98%AF%E7%99%BD%E4%B8%BE%E7%BA%B2" - }, - { - "title": "纪凌尘出演孟子义新剧", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E7%BA%AA%E5%87%8C%E5%B0%98%E5%87%BA%E6%BC%94%E5%AD%9F%E5%AD%90%E4%B9%89%E6%96%B0%E5%89%A7" - }, - { - "title": "外卖员妈妈暴雨中将孩子托付派出所", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%A4%96%E5%8D%96%E5%91%98%E5%A6%88%E5%A6%88%E6%9A%B4%E9%9B%A8%E4%B8%AD%E5%B0%86%E5%AD%A9%E5%AD%90%E6%89%98%E4%BB%98%E6%B4%BE%E5%87%BA%E6%89%80" - }, - { - "title": "我点外卖没用上券就这样", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E6%88%91%E7%82%B9%E5%A4%96%E5%8D%96%E6%B2%A1%E7%94%A8%E4%B8%8A%E5%88%B8%E5%B0%B1%E8%BF%99%E6%A0%B7" - }, - { - "title": "孙颖莎小时候真来过新疆", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%AD%99%E9%A2%96%E8%8E%8E%E5%B0%8F%E6%97%B6%E5%80%99%E7%9C%9F%E6%9D%A5%E8%BF%87%E6%96%B0%E7%96%86" - }, - { - "title": "印尼首都交通瘫痪", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%8D%B0%E5%B0%BC%E9%A6%96%E9%83%BD%E4%BA%A4%E9%80%9A%E7%98%AB%E7%97%AA" - }, - { - "title": "停狗位停满了小狗", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%81%9C%E7%8B%97%E4%BD%8D%E5%81%9C%E6%BB%A1%E4%BA%86%E5%B0%8F%E7%8B%97" - }, - { - "title": "怪不得校服裤子屁股锃亮", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E6%80%AA%E4%B8%8D%E5%BE%97%E6%A0%A1%E6%9C%8D%E8%A3%A4%E5%AD%90%E5%B1%81%E8%82%A1%E9%94%83%E4%BA%AE" - }, - { - "title": "这一幕幕中国浪漫看得心暖暖", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E8%BF%99%E4%B8%80%E5%B9%95%E5%B9%95%E4%B8%AD%E5%9B%BD%E6%B5%AA%E6%BC%AB%E7%9C%8B%E5%BE%97%E5%BF%83%E6%9A%96%E6%9A%96" - }, - { - "title": "林书豪退役", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E6%9E%97%E4%B9%A6%E8%B1%AA%E9%80%80%E5%BD%B9" - }, - { - "title": "小猫咪舔毛把自己累睡着", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%B0%8F%E7%8C%AB%E5%92%AA%E8%88%94%E6%AF%9B%E6%8A%8A%E8%87%AA%E5%B7%B1%E7%B4%AF%E7%9D%A1%E7%9D%80" - }, - { - "title": "iPhone17国行预计涨价500元", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=iPhone17%E5%9B%BD%E8%A1%8C%E9%A2%84%E8%AE%A1%E6%B6%A8%E4%BB%B7500%E5%85%83" - }, - { - "title": "土耳其总统埃尔多安抵达天津", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%9C%9F%E8%80%B3%E5%85%B6%E6%80%BB%E7%BB%9F%E5%9F%83%E5%B0%94%E5%A4%9A%E5%AE%89%E6%8A%B5%E8%BE%BE%E5%A4%A9%E6%B4%A5" - }, - { - "title": "脱口秀和Ta的朋友们", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E8%84%B1%E5%8F%A3%E7%A7%80%E5%92%8CTa%E7%9A%84%E6%9C%8B%E5%8F%8B%E4%BB%AC" - }, - { - "title": "孟子义暮晚摇", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%AD%9F%E5%AD%90%E4%B9%89%E6%9A%AE%E6%99%9A%E6%91%87" - } - ] -} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/热搜榜单/抖音热搜榜/css/background.css b/frontend/react-app/public/60sapi/热搜榜单/抖音热搜榜/css/background.css deleted file mode 100644 index fbf1fd3f..00000000 --- a/frontend/react-app/public/60sapi/热搜榜单/抖音热搜榜/css/background.css +++ /dev/null @@ -1,52 +0,0 @@ -/* 背景相关样式 */ -body { - background: linear-gradient(135deg, #e8f5e8 0%, #c8e6c9 25%, #a5d6a7 50%, #81c784 75%, #66bb6a 100%); - background-attachment: fixed; - min-height: 100vh; - position: relative; -} - -/* 背景装饰元素 */ -body::before { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - radial-gradient(circle at 20% 80%, rgba(120, 200, 120, 0.15) 0%, transparent 50%), - radial-gradient(circle at 80% 20%, rgba(100, 180, 100, 0.15) 0%, transparent 50%), - radial-gradient(circle at 40% 40%, rgba(140, 220, 140, 0.1) 0%, transparent 50%), - radial-gradient(circle at 60% 70%, rgba(160, 240, 160, 0.08) 0%, transparent 40%); - pointer-events: none; - z-index: -1; -} - -/* 浮动装饰圆点 */ -body::after { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - radial-gradient(circle at 10% 10%, rgba(76, 175, 80, 0.1) 2px, transparent 2px), - radial-gradient(circle at 90% 90%, rgba(76, 175, 80, 0.08) 1px, transparent 1px), - radial-gradient(circle at 30% 80%, rgba(76, 175, 80, 0.06) 1.5px, transparent 1.5px), - radial-gradient(circle at 70% 20%, rgba(76, 175, 80, 0.05) 1px, transparent 1px); - background-size: 100px 100px, 150px 150px, 80px 80px, 120px 120px; - animation: float 20s ease-in-out infinite alternate; - pointer-events: none; - z-index: -1; -} - -@keyframes float { - 0% { - transform: translateY(0px) rotate(0deg); - } - 100% { - transform: translateY(-10px) rotate(1deg); - } -} diff --git a/frontend/react-app/public/60sapi/热搜榜单/抖音热搜榜/css/style.css b/frontend/react-app/public/60sapi/热搜榜单/抖音热搜榜/css/style.css deleted file mode 100644 index 2d1682db..00000000 --- a/frontend/react-app/public/60sapi/热搜榜单/抖音热搜榜/css/style.css +++ /dev/null @@ -1,956 +0,0 @@ -/* 重置样式 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Helvetica Neue', Arial, sans-serif; - line-height: 1.6; - color: #2e7d32; - overflow-x: hidden; -} - -/* 容器 */ -.container { - max-width: 1200px; - margin: 0 auto; - padding: 20px; - animation: containerFadeIn 0.8s ease-out; -} - -@keyframes containerFadeIn { - from { - opacity: 0; - transform: translateY(20px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -/* 头部 */ -.header { - text-align: center; - margin-bottom: 40px; - background: rgba(255, 255, 255, 0.95); - padding: 35px 25px; - border-radius: 20px; - box-shadow: 0 8px 32px rgba(46, 125, 50, 0.12); - backdrop-filter: blur(15px); - border: 1px solid rgba(255, 255, 255, 0.3); - position: relative; - overflow: hidden; -} - -.header::before { - content: ''; - position: absolute; - top: 0; - left: -100%; - width: 100%; - height: 100%; - background: linear-gradient(90deg, transparent, rgba(76, 175, 80, 0.1), transparent); - animation: shimmer 3s infinite; -} - -@keyframes shimmer { - 0% { left: -100%; } - 100% { left: 100%; } -} - -.header-icon { - font-size: 3em; - margin-bottom: 10px; - animation: bounce 2s infinite; -} - -@keyframes bounce { - 0%, 20%, 50%, 80%, 100% { transform: translateY(0); } - 40% { transform: translateY(-10px); } - 60% { transform: translateY(-5px); } -} - -.title { - font-size: 2.8em; - font-weight: 700; - color: #1b5e20; - margin-bottom: 8px; - text-shadow: 0 2px 4px rgba(46, 125, 50, 0.1); - letter-spacing: 1px; -} - -.subtitle { - font-size: 1.1em; - color: #4caf50; - margin-bottom: 20px; - font-weight: 500; - opacity: 0.9; -} - -.update-time { - display: flex; - align-items: center; - justify-content: center; - gap: 8px; - color: #4caf50; - font-size: 0.95em; - margin-bottom: 20px; - padding: 8px 16px; - background: rgba(76, 175, 80, 0.1); - border-radius: 20px; - display: inline-flex; -} - -.time-icon { - font-size: 1.1em; - animation: tick 1s infinite; -} - -@keyframes tick { - 0%, 50% { transform: rotate(0deg); } - 25% { transform: rotate(15deg); } - 75% { transform: rotate(-15deg); } -} - -.refresh-btn { - background: linear-gradient(135deg, #4caf50, #66bb6a, #81c784); - color: white; - border: none; - padding: 12px 30px; - border-radius: 30px; - cursor: pointer; - font-size: 1em; - font-weight: 600; - transition: all 0.3s ease; - box-shadow: 0 4px 15px rgba(76, 175, 80, 0.3); - display: inline-flex; - align-items: center; - gap: 8px; - position: relative; - overflow: hidden; -} - -.refresh-btn::before { - content: ''; - position: absolute; - top: 50%; - left: 50%; - width: 0; - height: 0; - background: rgba(255, 255, 255, 0.2); - border-radius: 50%; - transform: translate(-50%, -50%); - transition: all 0.5s ease; -} - -.refresh-btn:hover::before { - width: 300px; - height: 300px; -} - -.refresh-btn:hover { - background: linear-gradient(135deg, #388e3c, #4caf50, #66bb6a); - box-shadow: 0 6px 20px rgba(76, 175, 80, 0.4); - transform: translateY(-3px); -} - -.refresh-btn:active { - transform: translateY(-1px); -} - -.btn-icon { - font-size: 1.1em; - transition: transform 0.3s ease; -} - -.refresh-btn:hover .btn-icon { - transform: rotate(180deg); -} - -/* 加载动画 */ -.loading { - text-align: center; - padding: 60px 30px; - background: rgba(255, 255, 255, 0.95); - border-radius: 20px; - margin-bottom: 20px; - box-shadow: 0 8px 32px rgba(46, 125, 50, 0.1); - backdrop-filter: blur(15px); -} - -.loading-content { - display: flex; - flex-direction: column; - align-items: center; - gap: 20px; -} - -.spinner { - width: 50px; - height: 50px; - border: 5px solid #e8f5e8; - border-top: 5px solid #4caf50; - border-radius: 50%; - animation: spin 1s linear infinite; - position: relative; -} - -.spinner::after { - content: ''; - position: absolute; - top: -5px; - left: -5px; - right: -5px; - bottom: -5px; - border: 2px solid transparent; - border-top: 2px solid #81c784; - border-radius: 50%; - animation: spin 2s linear infinite reverse; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -.loading-text { - display: flex; - flex-direction: column; - align-items: center; - gap: 15px; -} - -.loading-emoji { - font-size: 2.5em; - animation: pulse 1.5s ease-in-out infinite alternate; -} - -@keyframes pulse { - 0% { transform: scale(1); opacity: 0.8; } - 100% { transform: scale(1.1); opacity: 1; } -} - -.loading-text p { - font-size: 1.1em; - color: #4caf50; - font-weight: 500; - margin: 0; -} - -.loading-dots { - display: flex; - gap: 5px; -} - -.loading-dots span { - width: 8px; - height: 8px; - background: #4caf50; - border-radius: 50%; - animation: dot-bounce 1.4s ease-in-out infinite both; -} - -.loading-dots span:nth-child(1) { animation-delay: -0.32s; } -.loading-dots span:nth-child(2) { animation-delay: -0.16s; } - -@keyframes dot-bounce { - 0%, 80%, 100% { transform: scale(0.8); opacity: 0.5; } - 40% { transform: scale(1.2); opacity: 1; } -} - -/* 热搜列表 */ -.hot-list { - display: grid; - gap: 20px; - animation: fadeInUp 0.6s ease-out; -} - -@keyframes fadeInUp { - from { - opacity: 0; - transform: translateY(30px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -.hot-item { - background: rgba(255, 255, 255, 0.98); - border-radius: 16px; - padding: 25px; - box-shadow: 0 4px 20px rgba(46, 125, 50, 0.08); - transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94); - border: 1px solid rgba(76, 175, 80, 0.15); - backdrop-filter: blur(10px); - position: relative; - overflow: hidden; - animation: slideInLeft 0.6s ease-out; - animation-fill-mode: both; -} - -.hot-item:nth-child(odd) { - animation-delay: 0.1s; -} - -.hot-item:nth-child(even) { - animation-delay: 0.2s; -} - -@keyframes slideInLeft { - from { - opacity: 0; - transform: translateX(-50px); - } - to { - opacity: 1; - transform: translateX(0); - } -} - -.hot-item::before { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 4px; - height: 100%; - background: linear-gradient(to bottom, #4caf50, #81c784); - transform: scaleY(0); - transition: transform 0.3s ease; -} - -.hot-item:hover::before { - transform: scaleY(1); -} - -.hot-item:hover { - box-shadow: 0 8px 40px rgba(46, 125, 50, 0.15); - transform: translateY(-5px) scale(1.02); - border-color: rgba(76, 175, 80, 0.3); -} - -.hot-item-header { - display: flex; - align-items: center; - margin-bottom: 18px; - gap: 15px; -} - -.hot-rank { - background: linear-gradient(135deg, #4caf50, #66bb6a); - color: white; - min-width: 40px; - height: 40px; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - font-weight: bold; - font-size: 1em; - flex-shrink: 0; - position: relative; - box-shadow: 0 3px 10px rgba(76, 175, 80, 0.3); -} - -.hot-rank::after { - content: ''; - position: absolute; - top: -2px; - left: -2px; - right: -2px; - bottom: -2px; - background: linear-gradient(45deg, #4caf50, #81c784, #4caf50); - border-radius: 50%; - z-index: -1; - opacity: 0; - transition: opacity 0.3s ease; -} - -.hot-item:hover .hot-rank::after { - opacity: 0.7; -} - -.hot-rank.top-3 { - background: linear-gradient(135deg, #ff6b35, #f7931e, #ffa726); - box-shadow: 0 3px 15px rgba(255, 107, 53, 0.4); - animation: glow 2s ease-in-out infinite alternate; -} - -@keyframes glow { - 0% { box-shadow: 0 3px 15px rgba(255, 107, 53, 0.4); } - 100% { box-shadow: 0 3px 20px rgba(255, 107, 53, 0.6), 0 0 25px rgba(255, 107, 53, 0.3); } -} - -.hot-rank.top-3::before { - content: '👑'; - position: absolute; - top: -8px; - right: -5px; - font-size: 0.7em; - animation: crown-bounce 1s ease-in-out infinite alternate; -} - -@keyframes crown-bounce { - 0% { transform: translateY(0) rotate(-5deg); } - 100% { transform: translateY(-2px) rotate(5deg); } -} - -.hot-title { - font-size: 1.15em; - font-weight: 600; - color: #1b5e20; - flex: 1; - line-height: 1.4; - position: relative; -} - -.hot-content { - display: flex; - gap: 18px; - align-items: flex-start; -} - -.hot-cover { - width: 90px; - height: 90px; - border-radius: 12px; - object-fit: cover; - flex-shrink: 0; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); - transition: all 0.3s ease; - position: relative; - overflow: hidden; -} - -.hot-cover::after { - content: ''; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: linear-gradient(45deg, transparent 30%, rgba(255, 255, 255, 0.1) 50%, transparent 70%); - transform: translateX(-100%); - transition: transform 0.6s ease; -} - -.hot-item:hover .hot-cover::after { - transform: translateX(100%); -} - -.hot-item:hover .hot-cover { - box-shadow: 0 6px 20px rgba(0, 0, 0, 0.15); - transform: scale(1.05); -} - -.hot-info { - flex: 1; - display: flex; - flex-direction: column; - gap: 8px; -} - -.hot-value { - color: #e91e63; - font-weight: 700; - font-size: 1.1em; - display: flex; - align-items: center; - gap: 6px; -} - -.hot-value::before { - content: '热度'; - font-size: 1.2em; - animation: fire 1.5s ease-in-out infinite alternate; -} - -@keyframes fire { - 0% { transform: scale(1); } - 100% { transform: scale(1.1); } -} - -.hot-time { - color: #757575; - font-size: 0.9em; - display: flex; - align-items: center; - gap: 6px; -} - -.hot-time::before { - content: '📅日期'; - font-size: 1em; -} - -.hot-link { - display: inline-flex; - align-items: center; - gap: 6px; - color: #4caf50; - text-decoration: none; - font-size: 0.95em; - font-weight: 600; - padding: 8px 18px; - border: 2px solid #4caf50; - border-radius: 25px; - transition: all 0.3s ease; - position: relative; - overflow: hidden; - max-width: fit-content; -} - -.hot-link::before { - content: '👀'; - font-size: 1em; -} - -.hot-link::after { - content: ''; - position: absolute; - top: 0; - left: -100%; - width: 100%; - height: 100%; - background: linear-gradient(90deg, transparent, rgba(76, 175, 80, 0.2), transparent); - transition: left 0.5s ease; -} - -.hot-link:hover::after { - left: 100%; -} - -.hot-link:hover { - background: #4caf50; - color: white; - transform: scale(1.05); - box-shadow: 0 4px 15px rgba(76, 175, 80, 0.3); -} - -/* 错误信息 */ -.error-message { - text-align: center; - padding: 60px 30px; - background: rgba(255, 255, 255, 0.95); - border-radius: 20px; - box-shadow: 0 8px 32px rgba(211, 47, 47, 0.1); - backdrop-filter: blur(15px); - border: 1px solid rgba(255, 255, 255, 0.3); -} - -.error-content { - display: flex; - flex-direction: column; - align-items: center; - gap: 20px; -} - -.error-icon { - font-size: 4em; - animation: shake 1s ease-in-out infinite alternate; -} - -@keyframes shake { - 0% { transform: translateX(0); } - 25% { transform: translateX(-5px) rotate(-5deg); } - 50% { transform: translateX(5px) rotate(5deg); } - 75% { transform: translateX(-3px) rotate(-3deg); } - 100% { transform: translateX(0) rotate(0deg); } -} - -.error-content h3 { - font-size: 1.5em; - color: #d32f2f; - margin: 0; - font-weight: 600; -} - -.error-content p { - color: #757575; - font-size: 1em; - margin: 0; - line-height: 1.5; -} - -.retry-btn { - background: linear-gradient(135deg, #4caf50, #66bb6a); - color: white; - border: none; - padding: 12px 25px; - border-radius: 25px; - cursor: pointer; - font-size: 1em; - font-weight: 600; - transition: all 0.3s ease; - box-shadow: 0 4px 15px rgba(76, 175, 80, 0.3); - display: inline-flex; - align-items: center; - gap: 8px; -} - -.retry-btn:hover { - background: linear-gradient(135deg, #388e3c, #4caf50); - box-shadow: 0 6px 20px rgba(76, 175, 80, 0.4); - transform: translateY(-2px); -} - -.retry-btn span { - font-size: 1.1em; - transition: transform 0.3s ease; -} - -.retry-btn:hover span { - transform: rotate(180deg); -} - -/* 平板端适配 (768px - 1024px) */ -@media (min-width: 768px) and (max-width: 1024px) { - .container { - padding: 30px; - } - - .header { - padding: 40px 30px; - } - - .header-icon { - font-size: 3.5em; - } - - .title { - font-size: 2.5em; - } - - .subtitle { - font-size: 1.2em; - } - - .hot-list { - grid-template-columns: repeat(auto-fit, minmax(450px, 1fr)); - gap: 25px; - } - - .hot-item { - padding: 30px; - } - - .hot-cover { - width: 85px; - height: 85px; - } - - .hot-rank { - min-width: 42px; - height: 42px; - font-size: 1.05em; - } - - .hot-title { - font-size: 1.2em; - } - - .hot-value { - font-size: 1.15em; - } -} - -/* 电脑端适配 (1025px+) */ -@media (min-width: 1025px) { - .container { - padding: 40px; - } - - .header { - padding: 50px 40px; - margin-bottom: 50px; - } - - .header-icon { - font-size: 4em; - } - - .title { - font-size: 3.5em; - letter-spacing: 2px; - } - - .subtitle { - font-size: 1.3em; - } - - .hot-list { - grid-template-columns: repeat(auto-fit, minmax(550px, 1fr)); - gap: 30px; - } - - .hot-item { - padding: 35px; - } - - .hot-rank { - min-width: 45px; - height: 45px; - font-size: 1.1em; - } - - .hot-cover { - width: 110px; - height: 110px; - } - - .hot-title { - font-size: 1.3em; - } - - .hot-value { - font-size: 1.2em; - } - - .hot-time { - font-size: 1em; - } - - .hot-link { - font-size: 1em; - padding: 10px 20px; - } - - /* 电脑端特殊效果 */ - .hot-item:hover { - transform: translateY(-8px) scale(1.03); - } - - .hot-item::after { - content: ''; - position: absolute; - top: 50%; - right: 20px; - transform: translateY(-50%); - font-size: 1.5em; - opacity: 0; - transition: opacity 0.3s ease; - } - - .hot-item:hover::after { - opacity: 0.3; - } -} - -/* 手机端适配 (默认, 767px以下) */ -@media (max-width: 767px) { - .container { - padding: 15px; - } - - .header { - padding: 25px 20px; - margin-bottom: 25px; - } - - .header-icon { - font-size: 2.5em; - } - - .title { - font-size: 2.2em; - letter-spacing: 0.5px; - } - - .subtitle { - font-size: 1em; - } - - .update-time { - font-size: 0.9em; - padding: 6px 12px; - } - - .refresh-btn { - padding: 10px 20px; - font-size: 0.9em; - } - - .hot-item { - padding: 20px; - border-radius: 12px; - } - - .hot-rank { - min-width: 35px; - height: 35px; - font-size: 0.9em; - } - - .hot-title { - font-size: 1.05em; - line-height: 1.3; - } - - .hot-content { - flex-direction: column; - gap: 15px; - } - - .hot-cover { - width: 100%; - height: 180px; - align-self: center; - max-width: 280px; - border-radius: 10px; - } - - .hot-info { - gap: 10px; - } - - .hot-value { - font-size: 1.05em; - } - - .hot-time { - font-size: 0.85em; - } - - .hot-link { - font-size: 0.9em; - padding: 8px 16px; - align-self: flex-start; - } - - /* 手机端动画优化 */ - .hot-item { - animation-duration: 0.4s; - } - - .hot-item:hover { - transform: translateY(-2px) scale(1.01); - } -} - -/* 超小屏幕适配 (480px以下) */ -@media (max-width: 480px) { - .container { - padding: 12px; - } - - .header { - padding: 20px 15px; - margin-bottom: 20px; - } - - .header-icon { - font-size: 2.2em; - } - - .title { - font-size: 1.9em; - letter-spacing: 0.3px; - } - - .subtitle { - font-size: 0.95em; - } - - .update-time { - font-size: 0.85em; - padding: 5px 10px; - } - - .refresh-btn { - padding: 8px 16px; - font-size: 0.85em; - } - - .hot-list { - gap: 15px; - } - - .hot-item { - padding: 18px 15px; - border-radius: 10px; - } - - .hot-item-header { - margin-bottom: 15px; - gap: 12px; - } - - .hot-rank { - min-width: 32px; - height: 32px; - font-size: 0.85em; - } - - .hot-title { - font-size: 1em; - line-height: 1.25; - } - - .hot-content { - gap: 12px; - } - - .hot-cover { - height: 160px; - max-width: 260px; - border-radius: 8px; - } - - .hot-info { - gap: 8px; - } - - .hot-value { - font-size: 1em; - } - - .hot-time { - font-size: 0.8em; - } - - .hot-link { - font-size: 0.85em; - padding: 6px 14px; - } - - /* 超小屏幕性能优化 */ - .hot-item { - transition: transform 0.2s ease, box-shadow 0.2s ease; - } - - .hot-item::before, - .hot-item::after, - .hot-cover::after, - .hot-link::after { - display: none; - } - - .loading-content { - gap: 15px; - } - - .loading-emoji { - font-size: 2em; - } - - .loading-text p { - font-size: 1em; - } - - .error-icon { - font-size: 3em; - } - - .error-content h3 { - font-size: 1.3em; - } - - .error-content p { - font-size: 0.9em; - } -} diff --git a/frontend/react-app/public/60sapi/热搜榜单/抖音热搜榜/index.html b/frontend/react-app/public/60sapi/热搜榜单/抖音热搜榜/index.html deleted file mode 100644 index 9892695a..00000000 --- a/frontend/react-app/public/60sapi/热搜榜单/抖音热搜榜/index.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - 抖音热搜榜 - - - - -
    -
    -
    🔥
    -

    📱 抖音热搜榜 🎵

    -

    实时热门话题 · 紧跟潮流趋势

    -
    - - 加载中... -
    - -
    - -
    -
    -
    -
    - 🎭 -

    正在获取最新热搜...

    -
    - - - -
    -
    -
    -
    - -
    - -
    - - -
    - - - - diff --git a/frontend/react-app/public/60sapi/热搜榜单/抖音热搜榜/js/script.js b/frontend/react-app/public/60sapi/热搜榜单/抖音热搜榜/js/script.js deleted file mode 100644 index 5e57415c..00000000 --- a/frontend/react-app/public/60sapi/热搜榜单/抖音热搜榜/js/script.js +++ /dev/null @@ -1,300 +0,0 @@ -// API接口列表 -const API_ENDPOINTS = [ - "https://60s-cf.viki.moe", - "https://60s.viki.moe", - "https://60s.b23.run", - "https://60s.114128.xyz", - "https://60s-cf.114128.xyz" -]; - -// 当前使用的API索引 -let currentApiIndex = 0; - -// DOM元素 -const loadingElement = document.getElementById('loading'); -const hotListElement = document.getElementById('hotList'); -const errorMessageElement = document.getElementById('errorMessage'); -const updateTimeElement = document.getElementById('updateTime'); -const refreshBtn = document.getElementById('refreshBtn'); - -// 页面加载完成后自动加载数据 -document.addEventListener('DOMContentLoaded', function() { - loadHotList(); -}); - -// 刷新按钮点击事件 -refreshBtn.addEventListener('click', function() { - loadHotList(); -}); - -// 加载热搜列表 -async function loadHotList() { - showLoading(); - hideError(); - - try { - const data = await fetchData(); - displayHotList(data.data); - updateRefreshTime(); - } catch (error) { - console.error('加载失败:', error); - showError(); - } - - hideLoading(); -} - -// 获取数据 -async function fetchData() { - for (let i = 0; i < API_ENDPOINTS.length; i++) { - const apiUrl = API_ENDPOINTS[currentApiIndex]; - - try { - const response = await fetch(`${apiUrl}/v2/douyin`, { - method: 'GET', - headers: { - 'Accept': 'application/json', - }, - timeout: 10000 - }); - - if (!response.ok) { - throw new Error(`HTTP ${response.status}`); - } - - const data = await response.json(); - - if (data.code === 200 && data.data) { - return data; - } else { - throw new Error('数据格式错误'); - } - } catch (error) { - console.error(`API ${apiUrl} 请求失败:`, error); - currentApiIndex = (currentApiIndex + 1) % API_ENDPOINTS.length; - - if (i === API_ENDPOINTS.length - 1) { - throw new Error('所有API接口都无法访问'); - } - } - } -} - -// 显示热搜列表 -function displayHotList(hotData) { - hotListElement.innerHTML = ''; - - hotData.forEach((item, index) => { - const hotItem = createHotItem(item, index + 1); - hotListElement.appendChild(hotItem); - }); -} - -// 创建热搜项目 -function createHotItem(item, rank) { - const hotItem = document.createElement('div'); - hotItem.className = 'hot-item'; - - const rankClass = rank <= 3 ? 'hot-rank top-3' : 'hot-rank'; - const formattedHotValue = formatHotValue(item.hot_value); - const formattedTime = formatTime(item.event_time); - - // 根据排名添加特殊标识 - let rankEmoji = ''; - if (rank === 1) rankEmoji = '🥇'; - else if (rank === 2) rankEmoji = '🥈'; - else if (rank === 3) rankEmoji = '🥉'; - else if (rank <= 10) rankEmoji = '🔥'; - else rankEmoji = '📈'; - - // 根据热度值添加火焰等级 - let fireLevel = ''; - if (item.hot_value >= 11000000) fireLevel = '🔥🔥🔥🔥🔥🔥🔥🔥🔥'; - else if (item.hot_value >= 1000000) fireLevel = '🔥🔥🔥🔥🔥🔥🔥🔥'; - else if (item.hot_value >= 9500000) fireLevel = '🔥🔥🔥🔥🔥🔥🔥'; - else if (item.hot_value >= 9000000) fireLevel = '🔥🔥🔥🔥🔥🔥'; - else if (item.hot_value >= 8000000) fireLevel = '🔥🔥🔥🔥🔥'; - else if (item.hot_value >= 7000000) fireLevel = '🔥🔥🔥🔥'; - else if (item.hot_value >= 6000000) fireLevel = '🔥🔥🔥'; - else if (item.hot_value >= 5000000) fireLevel = '🔥🔥'; - else fireLevel = '🔥'; - - hotItem.innerHTML = ` -
    -
    ${rank}
    -
    ${rankEmoji} ${escapeHtml(item.title)}
    -
    -
    - ${escapeHtml(item.title)} -
    -
    ${fireLevel} ${formattedHotValue}
    -
    ${formattedTime}
    - - 查看详情 - -
    -
    - `; - - return hotItem; -} - -// 格式化热度值 -function formatHotValue(value) { - if (value >= 100000000) { - return (value / 100000000).toFixed(1) + '亿'; - } else if (value >= 10000) { - return (value / 10000).toFixed(1) + '万'; - } else { - return value.toLocaleString(); - } -} - -// 格式化时间 -function formatTime(timeStr) { - try { - const formattedTime = timeStr.replace(/\//g, '-'); - const date = new Date(formattedTime); - const now = new Date(); - const diff = now - date; - const minutes = Math.floor(diff / (1000 * 60)); - const hours = Math.floor(minutes / 60); - const days = Math.floor(hours / 24); - - if (days > 0) { - return `${days}天前`; - } else if (hours > 0) { - return `${hours}小时前`; - } else if (minutes > 0) { - return `${minutes}分钟前`; - } else { - return '刚刚'; - } - } catch (error) { - return timeStr; - } -} - -// HTML转义 -function escapeHtml(text) { - const div = document.createElement('div'); - div.textContent = text; - return div.innerHTML; -} - -// 图片加载错误处理 -function handleImageError(img) { - img.src = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAiIGhlaWdodD0iODAiIHZpZXdCb3g9IjAgMCA4MCA4MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjgwIiBoZWlnaHQ9IjgwIiBmaWxsPSIjZjVmNWY1Ii8+CjxwYXRoIGQ9Ik00MCAyMEM0NCAyMCA0NyAyMyA0NyAyN1Y1M0M0NyA1NyA0NCA2MCA0MCA2MEgxNkMxMiA2MCA5IDU3IDkgNTNWMjdDOSAyMyAxMiAyMCAxNiAyMEg0MFoiIHN0cm9rZT0iI2NjY2NjYyIgc3Ryb2tlLXdpZHRoPSIyIi8+CjxjaXJjbGUgY3g9IjMzIiBjeT0iMzIiIHI9IjMiIGZpbGw9IiNjY2NjY2MiLz4KPHBhdGggZD0iTTEzIDQ4TDIzIDM4TDMzIDQ4TDQzIDM4TDUzIDQ4IiBzdHJva2U9IiNjY2NjY2MiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+Cjwvc3ZnPgo='; - img.alt = '图片加载失败'; -} - -// 更新刷新时间 -function updateRefreshTime() { - const now = new Date(); - const timeStr = now.toLocaleString('zh-CN', { - year: 'numeric', - month: '2-digit', - day: '2-digit', - hour: '2-digit', - minute: '2-digit', - second: '2-digit' - }); - updateTimeElement.textContent = `最后更新: ${timeStr}`; - - // 添加成功提示 - showSuccessMessage('🎉 数据已更新'); -} - -// 显示成功消息 -function showSuccessMessage(message) { - // 移除之前的提示 - const existingToast = document.querySelector('.success-toast'); - if (existingToast) { - existingToast.remove(); - } - - const toast = document.createElement('div'); - toast.className = 'success-toast'; - toast.textContent = message; - toast.style.cssText = ` - position: fixed; - top: 20px; - right: 20px; - background: linear-gradient(135deg, #4caf50, #66bb6a); - color: white; - padding: 12px 20px; - border-radius: 25px; - box-shadow: 0 4px 20px rgba(76, 175, 80, 0.3); - z-index: 1000; - font-weight: 600; - font-size: 0.9em; - animation: slideIn 0.3s ease-out; - backdrop-filter: blur(10px); - `; - - document.body.appendChild(toast); - - // 3秒后自动移除 - setTimeout(() => { - toast.style.animation = 'slideOut 0.3s ease-in forwards'; - setTimeout(() => toast.remove(), 300); - }, 3000); -} - -// 添加CSS动画到页面 -if (!document.querySelector('#toast-styles')) { - const style = document.createElement('style'); - style.id = 'toast-styles'; - style.textContent = ` - @keyframes slideIn { - from { - opacity: 0; - transform: translateX(100px); - } - to { - opacity: 1; - transform: translateX(0); - } - } - - @keyframes slideOut { - from { - opacity: 1; - transform: translateX(0); - } - to { - opacity: 0; - transform: translateX(100px); - } - } - `; - document.head.appendChild(style); -} - -// 显示加载状态 -function showLoading() { - loadingElement.style.display = 'block'; - hotListElement.style.display = 'none'; -} - -// 隐藏加载状态 -function hideLoading() { - loadingElement.style.display = 'none'; - hotListElement.style.display = 'block'; -} - -// 显示错误信息 -function showError() { - errorMessageElement.style.display = 'block'; - hotListElement.style.display = 'none'; -} - -// 隐藏错误信息 -function hideError() { - errorMessageElement.style.display = 'none'; -} - -// 自动刷新 (每5分钟) -setInterval(function() { - loadHotList(); -}, 5 * 60 * 1000); diff --git a/frontend/react-app/public/60sapi/热搜榜单/抖音热搜榜/接口集合.json b/frontend/react-app/public/60sapi/热搜榜单/抖音热搜榜/接口集合.json deleted file mode 100644 index 04e92b7f..00000000 --- a/frontend/react-app/public/60sapi/热搜榜单/抖音热搜榜/接口集合.json +++ /dev/null @@ -1,7 +0,0 @@ -[ - "https://60s-cf.viki.moe", - "https://60s.viki.moe", - "https://60s.b23.run", - "https://60s.114128.xyz", - "https://60s-cf.114128.xyz" -] diff --git a/frontend/react-app/public/60sapi/热搜榜单/抖音热搜榜/返回接口.json b/frontend/react-app/public/60sapi/热搜榜单/抖音热搜榜/返回接口.json deleted file mode 100644 index 5094d4ec..00000000 --- a/frontend/react-app/public/60sapi/热搜榜单/抖音热搜榜/返回接口.json +++ /dev/null @@ -1,496 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": [ - { - "title": "九三阅兵具体安排公布", - "hot_value": 11821633, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oY1c972B7QzApGweaeQD3fGRo5aLIBrpCAuUSa~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=q01Se46GlLKYNv2klGKP1aM1cT0%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E4%B9%9D%E4%B8%89%E9%98%85%E5%85%B5%E5%85%B7%E4%BD%93%E5%AE%89%E6%8E%92%E5%85%AC%E5%B8%83", - "event_time": "2025/09/01 15:20:34", - "event_time_at": 1756711234, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "九月第一天", - "hot_value": 11327170, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oofTvDaDRCSs4hBFEFVJlAI9BBs0faZAc7IpGf~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=otkowVCSglk%2BS3tPrmBQFq6rIDw%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E4%B9%9D%E6%9C%88%E7%AC%AC%E4%B8%80%E5%A4%A9", - "event_time": "2025/09/01 07:28:57", - "event_time_at": 1756682937, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "遇见上合共享津彩", - "hot_value": 11222444, - "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015/oIJeINhBDBAiHADD4gi9Ae0CGALg1BqWI7vg0i~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=K%2BaEx5p%2BDv%2B1h3RgNnH0Yb9WT%2B8%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E9%81%87%E8%A7%81%E4%B8%8A%E5%90%88%E5%85%B1%E4%BA%AB%E6%B4%A5%E5%BD%A9", - "event_time": "2025/09/01 11:46:59", - "event_time_at": 1756698419, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "2025年开学第一课铭记与奋斗", - "hot_value": 11078403, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oA9NgVCRBABg7r70pQue8IzAUlfMaXf3hawOIB~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=3xYeXsD6JpXLDOVp6gYRxrvKFaM%3D&from=3218412987", - "link": "https://www.douyin.com/search/2025%E5%B9%B4%E5%BC%80%E5%AD%A6%E7%AC%AC%E4%B8%80%E8%AF%BE%E9%93%AD%E8%AE%B0%E4%B8%8E%E5%A5%8B%E6%96%97", - "event_time": "2025/09/01 11:21:13", - "event_time_at": 1756696873, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "石宇奇首夺世锦赛男单冠军", - "hot_value": 10395092, - "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015/oAf9IAlEuyE3lFiogfBuQFl8gDFqAoAHtFDNkE~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=tamoorhMGYhajvpmVNdX0TuUuZM%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E7%9F%B3%E5%AE%87%E5%A5%87%E9%A6%96%E5%A4%BA%E4%B8%96%E9%94%A6%E8%B5%9B%E7%94%B7%E5%8D%95%E5%86%A0%E5%86%9B", - "event_time": "2025/09/01 07:47:03", - "event_time_at": 1756684023, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "告别信息裸奔 国家网络身份认证来了", - "hot_value": 10255200, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oskNjrEUQIN9BBRCfeiDTGPE0geX0q6eAAyLr2~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=FrZQSxERPOBd6ktV8K%2Bt%2F3LgJ4A%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%91%8A%E5%88%AB%E4%BF%A1%E6%81%AF%E8%A3%B8%E5%A5%94%20%E5%9B%BD%E5%AE%B6%E7%BD%91%E7%BB%9C%E8%BA%AB%E4%BB%BD%E8%AE%A4%E8%AF%81%E6%9D%A5%E4%BA%86", - "event_time": "2025/09/01 10:28:41", - "event_time_at": 1756693721, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "记录我的开学第一天", - "hot_value": 9133236, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015c000-ce/owTXhhk40MlJDQHi8P2B07AviaBqAL0VI9EQi~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=pTEfiV%2FfsmGuQxNllsV8PqT0RYc%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E8%AE%B0%E5%BD%95%E6%88%91%E7%9A%84%E5%BC%80%E5%AD%A6%E7%AC%AC%E4%B8%80%E5%A4%A9", - "event_time": "2025/09/01 12:43:33", - "event_time_at": 1756701813, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "9月起这些新规开始施行", - "hot_value": 9105252, - "cover": "https://p26-sign.douyinpic.com/tos-cn-p-0015/oEE9BseGagtA7JRBmzYA1aRMoCMAeIxfLFY5gA~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=YgH%2BJdVPmi76okIWTRoyEEZ3iDg%3D&from=3218412987", - "link": "https://www.douyin.com/search/9%E6%9C%88%E8%B5%B7%E8%BF%99%E4%BA%9B%E6%96%B0%E8%A7%84%E5%BC%80%E5%A7%8B%E6%96%BD%E8%A1%8C", - "event_time": "2025/09/01 11:48:01", - "event_time_at": 1756698481, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "李幼斌与李云龙跨时空对话", - "hot_value": 8998174, - "cover": "https://p26-sign.douyinpic.com/tos-cn-p-0015/oAarINBoAgRIPi9VTEMIfHeA11nDtF7hRDuGcA~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=3x7yTXHYKiIcnNJjznvZjCw%2FW94%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E6%9D%8E%E5%B9%BC%E6%96%8C%E4%B8%8E%E6%9D%8E%E4%BA%91%E9%BE%99%E8%B7%A8%E6%97%B6%E7%A9%BA%E5%AF%B9%E8%AF%9D", - "event_time": "2025/09/01 12:01:05", - "event_time_at": 1756699265, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "幼儿园第一天开学哀嚎一片", - "hot_value": 8962824, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/osbXMAQYgIwwpkDCfeiDpGaE0gb9MXfeAAuLV2~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=w1l8V4VvjuO%2BvOvuQkXiEuXYko0%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%B9%BC%E5%84%BF%E5%9B%AD%E7%AC%AC%E4%B8%80%E5%A4%A9%E5%BC%80%E5%AD%A6%E5%93%80%E5%9A%8E%E4%B8%80%E7%89%87", - "event_time": "2025/09/01 11:05:01", - "event_time_at": 1756695901, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "田汉把国歌歌词写烟盒上系谣传", - "hot_value": 8930615, - "cover": "https://p3-sign.douyinpic.com/tos-cn-i-0813c001/ogA2AoCCXZMEAGF9f9QAlSACKRgfsC2oAFtIgD~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=7%2F8qsoQJd6TgpAEylOW1VyQrqeY%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E7%94%B0%E6%B1%89%E6%8A%8A%E5%9B%BD%E6%AD%8C%E6%AD%8C%E8%AF%8D%E5%86%99%E7%83%9F%E7%9B%92%E4%B8%8A%E7%B3%BB%E8%B0%A3%E4%BC%A0", - "event_time": "2025/09/01 13:51:28", - "event_time_at": 1756705888, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "苏超联赛积分榜", - "hot_value": 8838219, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/o4vPLtWIQAaiggBRkQq5kw9ZlIVA0v1iDAILU~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=JJlPUPmWRzT3UPMenizW639pqVg%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E8%8B%8F%E8%B6%85%E8%81%94%E8%B5%9B%E7%A7%AF%E5%88%86%E6%A6%9C", - "event_time": "2025/08/31 22:01:53", - "event_time_at": 1756648913, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "一切正开始", - "hot_value": 8609507, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015c000-ce/o8wN0EuXoETsyMz0ADCFFaAsFFTQeQf9fAublW~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=5I8uLkfpNYrGArQm%2BXLBa81NhYY%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E4%B8%80%E5%88%87%E6%AD%A3%E5%BC%80%E5%A7%8B", - "event_time": "2025/09/01 11:56:50", - "event_time_at": 1756699010, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "张玉宁为与球迷起冲突致歉", - "hot_value": 8511631, - "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015/oMfoIAFMN5GEWOzpBCDAQfaj7yRArCdByaEUfE~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=59ipMtNxZ8W3R5NNAJamlSOEbPo%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%BC%A0%E7%8E%89%E5%AE%81%E4%B8%BA%E4%B8%8E%E7%90%83%E8%BF%B7%E8%B5%B7%E5%86%B2%E7%AA%81%E8%87%B4%E6%AD%89", - "event_time": "2025/09/01 07:53:39", - "event_time_at": 1756684419, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "这一口会很疯狂", - "hot_value": 8454971, - "cover": "https://p26-sign.douyinpic.com/tos-cn-p-0015/oUIozRIBqC0ahA7FimIAmFEBeqDFfZK3Qfo8PE~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=ZBSuTMuu4678gSfReaVIfdK22J8%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E8%BF%99%E4%B8%80%E5%8F%A3%E4%BC%9A%E5%BE%88%E7%96%AF%E7%8B%82", - "event_time": "2025/09/01 10:36:16", - "event_time_at": 1756694176, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "邓超鹿晗合唱超级英雄", - "hot_value": 8357197, - "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015/oUBPIdtyQx0j8THRZAmZbyATihavQHI0niLIP~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=%2F66dsj8evHN94wNNFCn%2Bfhagee0%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E9%82%93%E8%B6%85%E9%B9%BF%E6%99%97%E5%90%88%E5%94%B1%E8%B6%85%E7%BA%A7%E8%8B%B1%E9%9B%84", - "event_time": "2025/09/01 07:45:11", - "event_time_at": 1756683911, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "伊萨克加盟利物浦", - "hot_value": 7963081, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/ocAw2yaT4I99iDIPh9I3LaIiLBTnBASvH0Q1a~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=v4Gq0Iz87wyZ6lEYYOnKmaeur%2FM%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E4%BC%8A%E8%90%A8%E5%85%8B%E5%8A%A0%E7%9B%9F%E5%88%A9%E7%89%A9%E6%B5%A6", - "event_time": "2025/09/01 09:12:12", - "event_time_at": 1756689132, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "山东泰山6:0北京国安", - "hot_value": 7830358, - "cover": "https://p9-sign.douyinpic.com/tos-cn-p-0015/ogtA9BEEJZDJ9SgzBBLfFN0AflNDGoIAQ2I8A8~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=gu6O%2BhGDarr%2BHQe1P%2BHo9pUmBGU%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%B1%B1%E4%B8%9C%E6%B3%B0%E5%B1%B16%3A0%E5%8C%97%E4%BA%AC%E5%9B%BD%E5%AE%89", - "event_time": "2025/08/31 20:32:53", - "event_time_at": 1756643573, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "又到开学你包书皮了吗", - "hot_value": 7828995, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oUAwaPjCIiLAQI6ADQMAm06TBJxPJFAkCpIIi~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=aUkYTtkfaUKbK2DhznXU69sg8SU%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%8F%88%E5%88%B0%E5%BC%80%E5%AD%A6%E4%BD%A0%E5%8C%85%E4%B9%A6%E7%9A%AE%E4%BA%86%E5%90%97", - "event_time": "2025/08/31 17:04:09", - "event_time_at": 1756631049, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "樊振东德甲首秀两连败", - "hot_value": 7754365, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/osOdEdibznClYwP0AABAIZW1eg0gbBmAzjiJfl~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=AyWBGXt%2FFFSp0QBM%2Bd5%2F9B4GPvo%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E6%A8%8A%E6%8C%AF%E4%B8%9C%E5%BE%B7%E7%94%B2%E9%A6%96%E7%A7%80%E4%B8%A4%E8%BF%9E%E8%B4%A5", - "event_time": "2025/09/01 07:16:58", - "event_time_at": 1756682218, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "为什么说00后的童年含金量高", - "hot_value": 7735122, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/ogOQEQsnAACDBICh7LeFWRGCjeZneIB9I3oVFy~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=Htnqu7SupC%2FmvQpF2DDsLDh5FYA%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E4%B8%BA%E4%BB%80%E4%B9%88%E8%AF%B400%E5%90%8E%E7%9A%84%E7%AB%A5%E5%B9%B4%E5%90%AB%E9%87%91%E9%87%8F%E9%AB%98", - "event_time": "2025/08/31 16:38:30", - "event_time_at": 1756629510, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "刘宇千年直拍", - "hot_value": 7734149, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015c000-ce/ostjBSmQ78E8estIXgFlHQxZQALRFfMepbTJWC~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=CPNw9h%2BpBB82qBykpuT11uMVFjo%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%88%98%E5%AE%87%E5%8D%83%E5%B9%B4%E7%9B%B4%E6%8B%8D", - "event_time": "2025/08/31 21:39:38", - "event_time_at": 1756647578, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "胡塞武装称将对以军袭击发起报复", - "hot_value": 7728698, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oseWgjCRBAfgft7c3QUm8JGApnYMaWdJdGj0SB~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=fX6AvTWQvNrihcvEraPHjJIS9iY%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E8%83%A1%E5%A1%9E%E6%AD%A6%E8%A3%85%E7%A7%B0%E5%B0%86%E5%AF%B9%E4%BB%A5%E5%86%9B%E8%A2%AD%E5%87%BB%E5%8F%91%E8%B5%B7%E6%8A%A5%E5%A4%8D", - "event_time": "2025/09/01 09:40:13", - "event_time_at": 1756690813, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "手把手教你手机变车机", - "hot_value": 7725104, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/o47qAXUjDQN6KLr9AjFSCq92ZBf4okAQEfgSAp~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=OoNNciUVTOwZbl17IUYBOjFyBJ4%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E6%89%8B%E6%8A%8A%E6%89%8B%E6%95%99%E4%BD%A0%E6%89%8B%E6%9C%BA%E5%8F%98%E8%BD%A6%E6%9C%BA", - "event_time": "2025/09/01 11:15:15", - "event_time_at": 1756696515, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "莫迪与普京拥抱手拉手热聊", - "hot_value": 7723445, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oIaWAojVPLRUILGIyvvg1Sd1ZiLAKiCB6zQIX~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=u1IGnKz%2FAckLe%2BYFCQulFw0ioB8%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E8%8E%AB%E8%BF%AA%E4%B8%8E%E6%99%AE%E4%BA%AC%E6%8B%A5%E6%8A%B1%E6%89%8B%E6%8B%89%E6%89%8B%E7%83%AD%E8%81%8A", - "event_time": "2025/09/01 15:38:27", - "event_time_at": 1756712307, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "原来猪猪侠搞抽象领先我20年", - "hot_value": 7706786, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oINGyAfS2oFpfAgF2kYxEJAqTbSeEcgotfxeHv~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=S1Ve0ORP5%2BrHumx%2FK7uJbfm8PbM%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%8E%9F%E6%9D%A5%E7%8C%AA%E7%8C%AA%E4%BE%A0%E6%90%9E%E6%8A%BD%E8%B1%A1%E9%A2%86%E5%85%88%E6%88%9120%E5%B9%B4", - "event_time": "2025/09/01 10:52:59", - "event_time_at": 1756695179, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "北京国安就惨败道歉", - "hot_value": 7702358, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oYiXICjfn7uEi3AeK6W04BiXu3iBjigAAs9W0B~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=hgh%2Bfy4Ul82LWgXAL2hkIBMEpJM%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%8C%97%E4%BA%AC%E5%9B%BD%E5%AE%89%E5%B0%B1%E6%83%A8%E8%B4%A5%E9%81%93%E6%AD%89", - "event_time": "2025/09/01 09:21:10", - "event_time_at": 1756689670, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "港姐冠军陈咏诗是博士生", - "hot_value": 7702059, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/okoRaMGvQBCI6KmVeBAAQ1eLEg1HK2foQuM7aB~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=5Lattu1v38oeQ8xGdXiDLcK4fwM%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E6%B8%AF%E5%A7%90%E5%86%A0%E5%86%9B%E9%99%88%E5%92%8F%E8%AF%97%E6%98%AF%E5%8D%9A%E5%A3%AB%E7%94%9F", - "event_time": "2025/09/01 10:47:23", - "event_time_at": 1756694843, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "王楚钦2:3徐瑛彬", - "hot_value": 7699514, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/o00BTIi1ogMR8LBAiQdLmSaIPAuEyIQv1IP48~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=2%2BI5KkQpEugBkQcVCrSLgOtC088%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E7%8E%8B%E6%A5%9A%E9%92%A62%3A3%E5%BE%90%E7%91%9B%E5%BD%AC", - "event_time": "2025/08/31 21:21:08", - "event_time_at": 1756646468, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "王源 高音", - "hot_value": 7693290, - "cover": "https://p26-sign.douyinpic.com/tos-cn-p-0015/oYzDIaQiavwPRBUpanIkjAIWzwLCIgPkAyiOj~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=uXVN6xfkB3tz3iVo0DQuxqeaGk0%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E7%8E%8B%E6%BA%90%20%E9%AB%98%E9%9F%B3", - "event_time": "2025/08/31 20:30:04", - "event_time_at": 1756643404, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "俄乌在苏贾前线展开阵地争夺", - "hot_value": 7691808, - "cover": "https://p9-sign.douyinpic.com/tos-cn-p-0015/oo7iATIG8vA5hIIQBILB4oCgvygsUNzBS1aPi~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=SNzQbbxAJqqtdIkck9kvtRUJnZg%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E4%BF%84%E4%B9%8C%E5%9C%A8%E8%8B%8F%E8%B4%BE%E5%89%8D%E7%BA%BF%E5%B1%95%E5%BC%80%E9%98%B5%E5%9C%B0%E4%BA%89%E5%A4%BA", - "event_time": "2025/09/01 12:56:05", - "event_time_at": 1756702565, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "范丞丞温柔版一个人的夜变装", - "hot_value": 7689433, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oAPLWIAoR3CsXgVBuIQIRiTDyS14gaLPwELAi~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=yp9l95J9xlKf55IEP14P7sD7J%2F4%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E8%8C%83%E4%B8%9E%E4%B8%9E%E6%B8%A9%E6%9F%94%E7%89%88%E4%B8%80%E4%B8%AA%E4%BA%BA%E7%9A%84%E5%A4%9C%E5%8F%98%E8%A3%85", - "event_time": "2025/09/01 15:32:00", - "event_time_at": 1756711920, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "用美食致敬这场胜利", - "hot_value": 7681826, - "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015/oIFcUfHotAXxALhJEj2EK9SBNp0fQwKhAbCgQD~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=Dkuyg5REqCAMEIsp0Dr%2B%2BkAO%2BmQ%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E7%94%A8%E7%BE%8E%E9%A3%9F%E8%87%B4%E6%95%AC%E8%BF%99%E5%9C%BA%E8%83%9C%E5%88%A9", - "event_time": "2025/09/01 12:08:24", - "event_time_at": 1756699704, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "田曦薇猫猫本体藏不住了", - "hot_value": 7674729, - "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015c000-ce/oceyeLnbxAXFERxnPfLR2egAkYaXeRpHfhAQME~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=omEVZta%2FQeV%2FSBRNZ3%2BJF0iMXPQ%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E7%94%B0%E6%9B%A6%E8%96%87%E7%8C%AB%E7%8C%AB%E6%9C%AC%E4%BD%93%E8%97%8F%E4%B8%8D%E4%BD%8F%E4%BA%86", - "event_time": "2025/09/01 14:33:25", - "event_time_at": 1756708405, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "少年心气是不可再生之物", - "hot_value": 7673518, - "cover": "https://p3-sign.douyinpic.com/tos-cn-i-0813c001/oAUJIWFyAFCmtGpmAADAQis69JogkCFAA0Eqff~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=YHeldSJZXPEBMLF2i%2Bj%2Fc60oKsQ%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%B0%91%E5%B9%B4%E5%BF%83%E6%B0%94%E6%98%AF%E4%B8%8D%E5%8F%AF%E5%86%8D%E7%94%9F%E4%B9%8B%E7%89%A9", - "event_time": "2025/09/01 07:54:31", - "event_time_at": 1756684471, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "南通2:1战胜苏州", - "hot_value": 7670255, - "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015/o4WAaBigTGBaeBgrqm5Kir0Af6DGO0IAF6IQPA~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=uV2f%2FvbzU4Y9DfhXxnPBc3hOAxY%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%8D%97%E9%80%9A2%3A1%E6%88%98%E8%83%9C%E8%8B%8F%E5%B7%9E", - "event_time": "2025/08/31 18:02:42", - "event_time_at": 1756634562, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "起猛了差点以为入冬了", - "hot_value": 7669368, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015c000-ce/ogA5HPw1xiIwS2szhaBPMZvC1P0LAPPQAigEZ~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=UQNTgz2vyL2UMvzVj2gzBmPbM2A%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E8%B5%B7%E7%8C%9B%E4%BA%86%E5%B7%AE%E7%82%B9%E4%BB%A5%E4%B8%BA%E5%85%A5%E5%86%AC%E4%BA%86", - "event_time": "2025/09/01 14:23:50", - "event_time_at": 1756707830, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "终于轮到我围观军训了", - "hot_value": 7655201, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015c000-ce/oobwIeLUf4O7iiazJOGAQLZO7DRgCDCBLhI2ez~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=WQn5PvdzvIerbF%2B1iNjF3b6itqQ%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E7%BB%88%E4%BA%8E%E8%BD%AE%E5%88%B0%E6%88%91%E5%9B%B4%E8%A7%82%E5%86%9B%E8%AE%AD%E4%BA%86", - "event_time": "2025/08/31 13:09:34", - "event_time_at": 1756616974, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "金铲铲陪伴是李现最长情的告白", - "hot_value": 7653496, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015c000-ce/oYPAKIM2vpBnPULXOmBbAEac6KzbOhSiILiLP~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=rsA7DcONzMySFGRNa4PMk6ftyBk%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E9%87%91%E9%93%B2%E9%93%B2%E9%99%AA%E4%BC%B4%E6%98%AF%E6%9D%8E%E7%8E%B0%E6%9C%80%E9%95%BF%E6%83%85%E7%9A%84%E5%91%8A%E7%99%BD", - "event_time": "2025/08/31 22:58:48", - "event_time_at": 1756652328, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "张予曦妈妈不介意女儿谈姐弟恋", - "hot_value": 7650811, - "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015/oEB5A1NsLFeadA9HQoED9TfmQ8jHgUPxACzjw9~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=KF3nedfpt5iPcUZ%2Fv9SyYI0ZSWg%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%BC%A0%E4%BA%88%E6%9B%A6%E5%A6%88%E5%A6%88%E4%B8%8D%E4%BB%8B%E6%84%8F%E5%A5%B3%E5%84%BF%E8%B0%88%E5%A7%90%E5%BC%9F%E6%81%8B", - "event_time": "2025/08/31 17:44:23", - "event_time_at": 1756633463, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "边伯贤也来刀马刀马了", - "hot_value": 7650164, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/ogfBltLZDIGmRGCAseKAeaIBRnQH79gBGOb4kC~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=nLrGTCoyqEGU882IYRhJOStMdpg%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E8%BE%B9%E4%BC%AF%E8%B4%A4%E4%B9%9F%E6%9D%A5%E5%88%80%E9%A9%AC%E5%88%80%E9%A9%AC%E4%BA%86", - "event_time": "2025/08/31 13:44:44", - "event_time_at": 1756619084, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "金靖演绎甜美女孩", - "hot_value": 7649913, - "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015/o0cBcsRQjiGGFCOOArGzzeIfLBA7FEYojeKwGQ~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=9BY7gGsW39uBcs06t%2BrXTCQ5J5k%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E9%87%91%E9%9D%96%E6%BC%94%E7%BB%8E%E7%94%9C%E7%BE%8E%E5%A5%B3%E5%AD%A9", - "event_time": "2025/08/31 19:00:32", - "event_time_at": 1756638032, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "一口气看日本如何造出反华体制", - "hot_value": 7648850, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oUoyIxcAADE55goYWdhBfFF4HACpRIpy9Xse6K~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=xjjRJGl0AzxkaEnOiVrzRx1hoZ8%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E4%B8%80%E5%8F%A3%E6%B0%94%E7%9C%8B%E6%97%A5%E6%9C%AC%E5%A6%82%E4%BD%95%E9%80%A0%E5%87%BA%E5%8F%8D%E5%8D%8E%E4%BD%93%E5%88%B6", - "event_time": "2025/08/30 21:50:31", - "event_time_at": 1756561831, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "张艺兴真空西装跳狼与美女", - "hot_value": 7646868, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015c000-ce/o4YKfLEIEEwo5stfDSFe0s2TFRjxXAAZDCE9Bl~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=gqBuLvszd8eew81uXP8rf7idtog%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%BC%A0%E8%89%BA%E5%85%B4%E7%9C%9F%E7%A9%BA%E8%A5%BF%E8%A3%85%E8%B7%B3%E7%8B%BC%E4%B8%8E%E7%BE%8E%E5%A5%B3", - "event_time": "2025/08/31 22:12:44", - "event_time_at": 1756649564, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "罗永浩对谈脱口秀新王何广智", - "hot_value": 7644688, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/okQ0qo1AKBQP3g981qQA1FEAzGDYjtFFdfYVeD~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=Mg24ss6tlv%2FY%2B%2B9PS5UdijEG1Dw%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E7%BD%97%E6%B0%B8%E6%B5%A9%E5%AF%B9%E8%B0%88%E8%84%B1%E5%8F%A3%E7%A7%80%E6%96%B0%E7%8E%8B%E4%BD%95%E5%B9%BF%E6%99%BA", - "event_time": "2025/09/01 13:56:14", - "event_time_at": 1756706174, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "周深的刀马刀马好可爱", - "hot_value": 7644052, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/osAPL0laAbWHtEmVBUIKMQDypItTiF3HI0PQi~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=qcK3K8uko38iBuRXDg4uCTaqEPc%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%91%A8%E6%B7%B1%E7%9A%84%E5%88%80%E9%A9%AC%E5%88%80%E9%A9%AC%E5%A5%BD%E5%8F%AF%E7%88%B1", - "event_time": "2025/08/31 18:31:56", - "event_time_at": 1756636316, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "杜克一哥的对话太好哭了", - "hot_value": 7639907, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oofoeQ9VAPDsphKEAiFQbQwCAEwoQgBpLtBC0A~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=wulyNlwPrSoIJu1JKBdKpE142mA%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E6%9D%9C%E5%85%8B%E4%B8%80%E5%93%A5%E7%9A%84%E5%AF%B9%E8%AF%9D%E5%A4%AA%E5%A5%BD%E5%93%AD%E4%BA%86", - "event_time": "2025/08/30 21:17:58", - "event_time_at": 1756559878, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "外媒全景记录普京抵华现场", - "hot_value": 7637541, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oIGC9LxDIQ6QAI1fG1eEipfA2eZjiGInCHFFEJ~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=HiKj%2FiLGiaN2D5GdS5OlAISbGHo%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%A4%96%E5%AA%92%E5%85%A8%E6%99%AF%E8%AE%B0%E5%BD%95%E6%99%AE%E4%BA%AC%E6%8A%B5%E5%8D%8E%E7%8E%B0%E5%9C%BA", - "event_time": "2025/09/01 11:59:34", - "event_time_at": 1756699174, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "赵丽颖工作室明兰代班营业", - "hot_value": 7635755, - "cover": "https://p26-sign.douyinpic.com/tos-cn-p-0015c000-ce/oIhHELPBeI6Ieb0A9OpCuWXh0CAAgiuniEweIw~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=xmQOeLdWN4FaeZjFBqtMQuctYv8%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E8%B5%B5%E4%B8%BD%E9%A2%96%E5%B7%A5%E4%BD%9C%E5%AE%A4%E6%98%8E%E5%85%B0%E4%BB%A3%E7%8F%AD%E8%90%A5%E4%B8%9A", - "event_time": "2025/08/31 20:52:34", - "event_time_at": 1756644754, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - } - ] -} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/热搜榜单/猫眼票房排行榜/css/style.css b/frontend/react-app/public/60sapi/热搜榜单/猫眼票房排行榜/css/style.css deleted file mode 100644 index e76f60c9..00000000 --- a/frontend/react-app/public/60sapi/热搜榜单/猫眼票房排行榜/css/style.css +++ /dev/null @@ -1,495 +0,0 @@ -/* 猫眼票房排行榜 - 淡绿色清新风格样式 */ - -/* 重置样式 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; - background: linear-gradient(135deg, #a8e6cf 0%, #dcedc1 50%, #ffd3a5 100%); - min-height: 100vh; - color: #2d5016; - line-height: 1.6; - overflow-x: hidden; -} - -.container { - max-width: 1200px; - margin: 0 auto; - padding: 20px; -} - -/* 头部样式 */ -.header { - text-align: center; - margin-bottom: 30px; - background: rgba(255, 255, 255, 0.85); - border-radius: 20px; - padding: 30px; - box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08); - backdrop-filter: blur(10px); -} - -.header h1 { - font-size: 2.5rem; - color: #2d5016; - margin-bottom: 10px; - font-weight: 700; - display: flex; - align-items: center; - justify-content: center; - gap: 15px; -} - -.header p { - color: #5a7c65; - font-size: 1.1rem; -} - -/* 加载状态 */ -.loading { - text-align: center; - padding: 40px; - background: rgba(255, 255, 255, 0.85); - border-radius: 15px; - box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08); -} - -.spinner { - width: 40px; - height: 40px; - border: 4px solid #e8f5e8; - border-top: 4px solid #81c784; - border-radius: 50%; - animation: spin 1s linear infinite; - margin: 0 auto 20px; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -/* 票房排行榜容器 */ -.ranking-container { - background: rgba(255, 255, 255, 0.85); - border-radius: 20px; - padding: 30px; - box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08); - backdrop-filter: blur(10px); - margin-bottom: 20px; -} - -/* 排行榜标题 */ -.ranking-title { - text-align: center; - font-size: 1.8rem; - font-weight: 700; - color: #2d5016; - margin-bottom: 25px; -} - -/* 票房排行榜列表 */ -.movie-list { - display: grid; - gap: 15px; -} - -/* 电影项目 */ -.movie-item { - background: rgba(255, 255, 255, 0.9); - border-radius: 15px; - padding: 20px; - box-shadow: 0 4px 15px rgba(45, 80, 22, 0.05); - transition: all 0.3s ease; - border-left: 5px solid transparent; - position: relative; - overflow: hidden; -} - -.movie-item:hover { - transform: translateY(-2px); - box-shadow: 0 8px 25px rgba(45, 80, 22, 0.12); -} - -/* 前三名特殊样式 */ -.movie-item.top-1 { - border-left-color: #ffd700; - background: linear-gradient(135deg, rgba(255, 215, 0, 0.1) 0%, rgba(255, 255, 255, 0.9) 100%); -} - -.movie-item.top-2 { - border-left-color: #c0c0c0; - background: linear-gradient(135deg, rgba(192, 192, 192, 0.1) 0%, rgba(255, 255, 255, 0.9) 100%); -} - -.movie-item.top-3 { - border-left-color: #cd7f32; - background: linear-gradient(135deg, rgba(205, 127, 50, 0.1) 0%, rgba(255, 255, 255, 0.9) 100%); -} - -/* 排名徽章 */ -.rank-badge { - position: absolute; - top: -10px; - right: -10px; - width: 50px; - height: 50px; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - font-weight: bold; - font-size: 1.2rem; - color: white; - box-shadow: 0 4px 10px rgba(0, 0, 0, 0.2); -} - -.rank-badge.gold { - background: linear-gradient(135deg, #ffd700, #ffed4a); -} - -.rank-badge.silver { - background: linear-gradient(135deg, #c0c0c0, #e2e8f0); -} - -.rank-badge.bronze { - background: linear-gradient(135deg, #cd7f32, #d69e2e); -} - -.rank-badge.regular { - background: linear-gradient(135deg, #81c784, #66bb6a); -} - -/* 电影信息布局 */ -.movie-info { - display: grid; - grid-template-columns: auto 1fr auto; - align-items: center; - gap: 20px; -} - -.rank-number { - font-size: 2rem; - font-weight: bold; - color: #2d5016; - min-width: 60px; -} - -.movie-details { - flex: 1; -} - -.movie-name { - font-size: 1.3rem; - font-weight: 700; - color: #2d5016; - margin-bottom: 5px; -} - -.movie-year { - color: #5a7c65; - font-size: 0.95rem; - margin-bottom: 8px; -} - -.box-office { - text-align: right; -} - -.box-office-amount { - font-size: 1.4rem; - font-weight: bold; - color: #1b5e20; - margin-bottom: 3px; -} - -.box-office-desc { - color: #5a7c65; - font-size: 0.9rem; -} - -/* 统计信息 */ -.stats-container { - background: rgba(255, 255, 255, 0.85); - border-radius: 15px; - padding: 20px; - margin-bottom: 20px; - box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08); - backdrop-filter: blur(10px); -} - -.stats-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); - gap: 20px; - text-align: center; -} - -.stat-item { - background: rgba(129, 199, 132, 0.1); - border-radius: 10px; - padding: 15px; -} - -.stat-value { - font-size: 1.5rem; - font-weight: bold; - color: #2d5016; -} - -.stat-label { - color: #5a7c65; - font-size: 0.9rem; - margin-top: 5px; -} - -/* 更新时间 */ -.update-time { - text-align: center; - color: #5a7c65; - font-size: 0.9rem; - margin-top: 20px; - padding: 15px; - background: rgba(255, 255, 255, 0.7); - border-radius: 10px; -} - -/* 错误提示 */ -.error { - text-align: center; - padding: 40px; - background: rgba(255, 255, 255, 0.85); - border-radius: 15px; - box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08); -} - -.error h3 { - color: #d32f2f; - margin-bottom: 15px; - font-size: 1.5rem; -} - -.error p { - color: #5a7c65; - margin-bottom: 10px; -} - -/* 动画效果 */ -.fade-in { - animation: fadeIn 0.6s ease-in-out; -} - -@keyframes fadeIn { - from { - opacity: 0; - transform: translateY(20px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -/* 平板端适配 (768px - 1024px) */ -@media screen and (max-width: 1024px) and (min-width: 768px) { - .container { - padding: 15px; - } - - .header h1 { - font-size: 2.2rem; - } - - .ranking-container { - padding: 25px; - } - - .movie-info { - gap: 15px; - } - - .rank-number { - font-size: 1.8rem; - min-width: 50px; - } - - .movie-name { - font-size: 1.2rem; - } - - .box-office-amount { - font-size: 1.3rem; - } -} - -/* 手机端适配 (最大767px) - 优先优化 */ -@media screen and (max-width: 767px) { - .container { - padding: 10px; - } - - .header { - padding: 20px; - margin-bottom: 20px; - } - - .header h1 { - font-size: 1.8rem; - flex-direction: column; - gap: 10px; - } - - .header p { - font-size: 1rem; - } - - .ranking-container { - padding: 20px 15px; - margin-bottom: 15px; - } - - .ranking-title { - font-size: 1.5rem; - margin-bottom: 20px; - } - - .movie-item { - padding: 15px; - margin-bottom: 10px; - } - - .movie-info { - grid-template-columns: 50px 1fr; - grid-template-rows: auto auto; - gap: 10px; - } - - .rank-number { - font-size: 1.5rem; - min-width: 40px; - grid-row: 1 / 3; - } - - .movie-details { - grid-column: 2; - grid-row: 1; - } - - .box-office { - grid-column: 2; - grid-row: 2; - text-align: left; - margin-top: 8px; - } - - .movie-name { - font-size: 1.1rem; - margin-bottom: 3px; - } - - .movie-year { - font-size: 0.85rem; - margin-bottom: 5px; - } - - .box-office-amount { - font-size: 1.2rem; - } - - .box-office-desc { - font-size: 0.85rem; - } - - .rank-badge { - width: 40px; - height: 40px; - font-size: 1rem; - top: -8px; - right: -8px; - } - - .stats-grid { - grid-template-columns: 1fr; - gap: 15px; - } - - .stat-item { - padding: 12px; - } - - .stat-value { - font-size: 1.3rem; - } - - .update-time { - padding: 12px; - font-size: 0.85rem; - } -} - -/* 小屏手机适配 (最大480px) */ -@media screen and (max-width: 480px) { - .container { - padding: 8px; - } - - .header { - padding: 15px; - } - - .header h1 { - font-size: 1.6rem; - } - - .ranking-container { - padding: 15px 10px; - } - - .movie-item { - padding: 12px; - } - - .movie-name { - font-size: 1rem; - } - - .box-office-amount { - font-size: 1.1rem; - } - - .rank-number { - font-size: 1.3rem; - min-width: 35px; - } -} - -/* 高分辨率显示器优化 */ -@media screen and (min-width: 1440px) { - .container { - max-width: 1400px; - } - - .header h1 { - font-size: 3rem; - } - - .movie-list { - gap: 20px; - } - - .movie-item { - padding: 25px; - } - - .movie-name { - font-size: 1.4rem; - } - - .box-office-amount { - font-size: 1.5rem; - } -} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/热搜榜单/猫眼票房排行榜/index.html b/frontend/react-app/public/60sapi/热搜榜单/猫眼票房排行榜/index.html deleted file mode 100644 index 21b84c4b..00000000 --- a/frontend/react-app/public/60sapi/热搜榜单/猫眼票房排行榜/index.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - 猫眼票房排行榜 | 全球电影总票房 - - - - - - - - -
    - -
    -

    - 🎬 - 猫眼票房排行榜(时更) -

    -

    展示全球电影总票房排行榜,数据来自权威源头,稳定实时

    -
    - - -
    -
    -

    正在加载票房数据...

    -
    - - -
    -
    - - - - - \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/热搜榜单/猫眼票房排行榜/js/script.js b/frontend/react-app/public/60sapi/热搜榜单/猫眼票房排行榜/js/script.js deleted file mode 100644 index 39119c89..00000000 --- a/frontend/react-app/public/60sapi/热搜榜单/猫眼票房排行榜/js/script.js +++ /dev/null @@ -1,249 +0,0 @@ -// 猫眼票房排行榜 - JavaScript 实现 - -const API = { - endpoints: [], - currentIndex: 0, - params: { - encoding: 'json' - }, - localFallback: '返回接口.json', - // 初始化API接口列表 - async init() { - try { - const res = await fetch('./接口集合.json'); - const endpoints = await res.json(); - this.endpoints = endpoints.map(endpoint => `${endpoint}/v2/maoyan`); - } catch (e) { - // 如果无法加载接口集合,使用默认接口 - this.endpoints = ['https://60s.viki.moe/v2/maoyan']; - } - }, - // 获取当前接口URL - getCurrentUrl() { - if (this.endpoints.length === 0) return null; - const url = new URL(this.endpoints[this.currentIndex]); - Object.entries(this.params).forEach(([k, v]) => url.searchParams.append(k, v)); - return url.toString(); - }, - // 切换到下一个接口 - switchToNext() { - this.currentIndex = (this.currentIndex + 1) % this.endpoints.length; - return this.currentIndex < this.endpoints.length; - }, - // 重置到第一个接口 - reset() { - this.currentIndex = 0; - } -}; - -let elements = {}; - -// 初始化 -window.addEventListener('DOMContentLoaded', () => { - initElements(); - loadMaoyanList(); -}); - -function initElements() { - elements = { - container: document.getElementById('ranking-content'), - loading: document.getElementById('loading'), - updateTime: document.getElementById('api-update-time'), - statsTotal: document.getElementById('stats-total'), - statsTop10: document.getElementById('stats-top10') - }; -} - -async function loadMaoyanList() { - try { - showLoading(true); - - // 优先从线上API请求 - let data = await fetchFromAPI(); - - // 如果线上失败,尝试从本地返回接口.json加载 - if (!data) { - data = await fetchFromLocal(); - } - - if (!data || data.code !== 200 || !data.data) { - throw new Error(data && data.message ? data.message : '未能获取到有效数据'); - } - - renderRanking(data.data); - } catch (error) { - console.error('加载排行榜失败:', error); - showError(error.message || '加载失败,请稍后重试'); - } finally { - showLoading(false); - } -} - -async function fetchFromAPI() { - // 初始化API接口列表 - await API.init(); - - // 重置API索引到第一个接口 - API.reset(); - - // 尝试所有API接口 - for (let i = 0; i < API.endpoints.length; i++) { - try { - const url = API.getCurrentUrl(); - console.log(`尝试接口 ${i + 1}/${API.endpoints.length}: ${url}`); - - const resp = await fetch(url, { - cache: 'no-store', - timeout: 10000 // 10秒超时 - }); - - if (!resp.ok) { - throw new Error(`HTTP ${resp.status}: ${resp.statusText}`); - } - - const data = await resp.json(); - - if (data && data.code === 200) { - console.log(`接口 ${i + 1} 请求成功`); - return data; - } - - throw new Error(data && data.message ? data.message : '接口返回异常'); - - } catch (e) { - console.warn(`接口 ${i + 1} 失败:`, e.message); - - // 如果不是最后一个接口,切换到下一个 - if (i < API.endpoints.length - 1) { - API.switchToNext(); - continue; - } - - // 所有接口都失败了 - console.warn('所有远程接口都失败,尝试本地数据'); - return null; - } - } -} - -async function fetchFromLocal() { - try { - const resp = await fetch(API.localFallback + `?t=${Date.now()}`); - if (!resp.ok) throw new Error(`本地文件HTTP ${resp.status}`); - const data = await resp.json(); - return data; - } catch (e) { - console.error('读取本地返回接口.json失败:', e); - return null; - } -} - -function renderRanking(payload) { - const { list = [], tip = '', update_time = '', update_time_at } = payload || {}; - - // 更新时间 - if (elements.updateTime) { - elements.updateTime.textContent = update_time ? `更新时间:${update_time}` : ''; - } - - // 统计信息 - if (elements.statsTotal) { - elements.statsTotal.textContent = list.length; - } - if (elements.statsTop10) { - elements.statsTop10.textContent = Math.min(10, list.length); - } - - // 渲染列表 - const html = ` -
    -
    -
    -
    ${list.length}
    -
    入榜影片数量
    -
    -
    -
    ${Math.min(10, list.length)}
    -
    TOP10 数量
    -
    -
    -
    -
    -

    全球电影总票房排行榜

    -
    - ${list.map(item => renderMovieItem(item)).join('')} -
    -
    - ${tip ? `
    ${escapeHtml(tip)}
    ` : ''} - ${update_time ? `
    更新时间:${escapeHtml(update_time)}
    ` : ''} - `; - - elements.container.innerHTML = html; - elements.container.classList.add('fade-in'); -} - -function renderMovieItem(item) { - const rank = item.rank; - const cls = rank === 1 ? 'top-1' : rank === 2 ? 'top-2' : rank === 3 ? 'top-3' : ''; - const badgeCls = rank === 1 ? 'gold' : rank === 2 ? 'silver' : rank === 3 ? 'bronze' : 'regular'; - - return ` -
    -
    ${rank}
    -
    -
    #${rank}
    -
    -
    ${escapeHtml(item.movie_name)}
    -
    上映年份:${escapeHtml(item.release_year || '')}
    -
    -
    -
    ${formatCurrencyDesc(item.box_office_desc, item.box_office)}
    -
    总票房
    -
    -
    -
    - `; -} - -function formatCurrencyDesc(desc, num) { - if (desc && typeof desc === 'string' && desc.trim()) return desc; - if (typeof num === 'number') { - // 人民币按亿元显示 - if (num >= 1e8) return (num / 1e8).toFixed(2) + '亿元'; - if (num >= 1e4) return (num / 1e4).toFixed(2) + '万元'; - return num.toLocaleString('zh-CN') + '元'; - } - return '—'; -} - -function showLoading(show) { - if (elements.loading) elements.loading.style.display = show ? 'block' : 'none'; - if (elements.container) elements.container.style.display = show ? 'none' : 'block'; -} - -function showError(message) { - if (!elements.container) return; - elements.container.innerHTML = ` -
    -

    ⚠️ 加载失败

    -

    ${escapeHtml(message)}

    -

    请稍后重试

    -
    - `; - elements.container.style.display = 'block'; -} - -function escapeHtml(text) { - if (text == null) return ''; - const div = document.createElement('div'); - div.textContent = String(text); - return div.innerHTML; -} - -// 键盘刷新快捷键 Ctrl/Cmd + R 刷新数据区域(不刷新整页) -window.addEventListener('keydown', (e) => { - if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === 'r') { - e.preventDefault(); - loadMaoyanList(); - } -}); \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/热搜榜单/猫眼票房排行榜/接口集合.json b/frontend/react-app/public/60sapi/热搜榜单/猫眼票房排行榜/接口集合.json deleted file mode 100644 index 04e92b7f..00000000 --- a/frontend/react-app/public/60sapi/热搜榜单/猫眼票房排行榜/接口集合.json +++ /dev/null @@ -1,7 +0,0 @@ -[ - "https://60s-cf.viki.moe", - "https://60s.viki.moe", - "https://60s.b23.run", - "https://60s.114128.xyz", - "https://60s-cf.114128.xyz" -] diff --git a/frontend/react-app/public/60sapi/热搜榜单/猫眼票房排行榜/返回接口.json b/frontend/react-app/public/60sapi/热搜榜单/猫眼票房排行榜/返回接口.json deleted file mode 100644 index 945e5cfe..00000000 --- a/frontend/react-app/public/60sapi/热搜榜单/猫眼票房排行榜/返回接口.json +++ /dev/null @@ -1,171 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": { - "list": [ - { - "rank": 1, - "maoyan_id": 243, - "movie_name": "阿凡达", - "release_year": "2009", - "box_office": 21200972239, - "box_office_desc": "212.01亿元" - }, - { - "rank": 2, - "maoyan_id": 248172, - "movie_name": "复仇者联盟 4:终局之战", - "release_year": "2019", - "box_office": 20299852689, - "box_office_desc": "203亿元" - }, - { - "rank": 3, - "maoyan_id": 78461, - "movie_name": "阿凡达:水之道", - "release_year": "2022", - "box_office": 16825062887, - "box_office_desc": "168.25亿元" - }, - { - "rank": 4, - "maoyan_id": 267, - "movie_name": "泰坦尼克号", - "release_year": "1997", - "box_office": 16423064756, - "box_office_desc": "164.23亿元" - }, - { - "rank": 5, - "maoyan_id": 1294273, - "movie_name": "哪吒之魔童闹海", - "release_year": "2025", - "box_office": 15908714214, - "box_office_desc": "159.09亿元" - }, - { - "rank": 6, - "maoyan_id": 78536, - "movie_name": "星球大战:原力觉醒", - "release_year": "2015", - "box_office": 15019898914, - "box_office_desc": "150.2亿元" - }, - { - "rank": 7, - "maoyan_id": 248170, - "movie_name": "复仇者联盟 3:无限战争", - "release_year": "2018", - "box_office": 14882882413, - "box_office_desc": "148.83亿元" - }, - { - "rank": 8, - "maoyan_id": 1254435, - "movie_name": "蜘蛛侠:英雄无归", - "release_year": "2021", - "box_office": 14160042137, - "box_office_desc": "141.6亿元" - }, - { - "rank": 9, - "maoyan_id": 1479534, - "movie_name": "头脑特工队 2", - "release_year": "2024", - "box_office": 12319141075, - "box_office_desc": "123.19亿元" - }, - { - "rank": 10, - "maoyan_id": 78602, - "movie_name": "侏罗纪世界", - "release_year": "2015", - "box_office": 12120986621, - "box_office_desc": "121.21亿元" - }, - { - "rank": 11, - "maoyan_id": 1189879, - "movie_name": "狮子王", - "release_year": "2019", - "box_office": 12051977766, - "box_office_desc": "120.52亿元" - }, - { - "rank": 12, - "maoyan_id": 262, - "movie_name": "复仇者联盟", - "release_year": "2012", - "box_office": 11026033139, - "box_office_desc": "110.26亿元" - }, - { - "rank": 13, - "maoyan_id": 78405, - "movie_name": "速度与激情 7", - "release_year": "2015", - "box_office": 10988354292, - "box_office_desc": "109.88亿元" - }, - { - "rank": 14, - "maoyan_id": 341152, - "movie_name": "壮志凌云 2:独行侠", - "release_year": "2022", - "box_office": 10845892091, - "box_office_desc": "108.46亿元" - }, - { - "rank": 15, - "maoyan_id": 247949, - "movie_name": "冰雪奇缘 2", - "release_year": "2019", - "box_office": 10541240357, - "box_office_desc": "105.41亿元" - }, - { - "rank": 16, - "maoyan_id": 344942, - "movie_name": "芭比", - "release_year": "2023", - "box_office": 10493054406, - "box_office_desc": "104.93亿元" - }, - { - "rank": 17, - "maoyan_id": 78429, - "movie_name": "复仇者联盟 2:奥创纪元", - "release_year": "2015", - "box_office": 10188347873, - "box_office_desc": "101.88亿元" - }, - { - "rank": 18, - "maoyan_id": 1250896, - "movie_name": "超级马里奥兄弟大电影", - "release_year": "2023", - "box_office": 9868050757, - "box_office_desc": "98.68亿元" - }, - { - "rank": 19, - "maoyan_id": 341138, - "movie_name": "黑豹", - "release_year": "2018", - "box_office": 9788853998, - "box_office_desc": "97.89亿元" - }, - { - "rank": 20, - "maoyan_id": 916, - "movie_name": "哈利・波特与死亡圣器(下)", - "release_year": "2011", - "box_office": 9735002643, - "box_office_desc": "97.35亿元" - } - ], - "tip": "注:内地票房数据实时更新,包括点映及预售票房。港澳台及海外票房为统计数据,每小时更新。汇率采用 2025年1月31日市场汇率,1美元≈7.2514人民币", - "update_time": "2025/08/19 14:41:34", - "update_time_at": 1755585694385 - } -} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/热搜榜单/网易云榜单列表/接口集合.json b/frontend/react-app/public/60sapi/热搜榜单/网易云榜单列表/接口集合.json deleted file mode 100644 index 04e92b7f..00000000 --- a/frontend/react-app/public/60sapi/热搜榜单/网易云榜单列表/接口集合.json +++ /dev/null @@ -1,7 +0,0 @@ -[ - "https://60s-cf.viki.moe", - "https://60s.viki.moe", - "https://60s.b23.run", - "https://60s.114128.xyz", - "https://60s-cf.114128.xyz" -] diff --git a/frontend/react-app/public/60sapi/热搜榜单/网易云榜单列表/返回接口.json b/frontend/react-app/public/60sapi/热搜榜单/网易云榜单列表/返回接口.json deleted file mode 100644 index f0b8c79f..00000000 --- a/frontend/react-app/public/60sapi/热搜榜单/网易云榜单列表/返回接口.json +++ /dev/null @@ -1,750 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": [ - { - "id": 19723756, - "name": "飙升榜", - "description": "云音乐中每天热度上升最快的100首单曲,每日更新。", - "cover": "https://p1.music.126.net/rIi7Qzy2i2Y_1QD7cd0MYA==/109951170048506929.jpg", - "update_frequency": "每天更新", - "updated": "2025-08-27 01:24:43", - "updated_at": 1756257883349, - "created": "2014-06-30 07:58:56", - "created_at": 1404115136883, - "link": "https://music.163.com/#/discover/toplist?id=19723756" - }, - { - "id": 3779629, - "name": "新歌榜", - "description": "云音乐新歌榜:云音乐用户一周内收听所有新歌(一月内最新发行) 官方TOP排行榜,每天更新。", - "cover": "https://p1.music.126.net/5guhqPBTcIrrhLBotgaT6w==/109951170048511751.jpg", - "update_frequency": "每天更新", - "updated": "2025-08-27 00:56:52", - "updated_at": 1756256212440, - "created": "2013-09-09 10:09:58", - "created_at": 1378721398225, - "link": "https://music.163.com/#/discover/toplist?id=3779629" - }, - { - "id": 2884035, - "name": "原创榜", - "description": "云音乐独立原创音乐人作品官方榜单,以推荐优秀原创作品为目的。每周四网易云音乐首发。申请网易音乐人:http://music.163.com/nmusician/", - "cover": "https://p1.music.126.net/BaP9nrocNTL3gGThysv4eQ==/109951170091896587.jpg", - "update_frequency": "每周四更新", - "updated": "2025-08-21 02:53:19", - "updated_at": 1755744799157, - "created": "2013-07-25 06:05:25", - "created_at": 1374732325894, - "link": "https://music.163.com/#/discover/toplist?id=2884035" - }, - { - "id": 3778678, - "name": "热歌榜", - "description": "云音乐热歌榜:云音乐用户一周内收听所有线上歌曲官方TOP排行榜,每日更新。", - "cover": "https://p1.music.126.net/0SUEG8yDACfx0Bw2MYFv4Q==/109951170048519512.jpg", - "update_frequency": "每天更新", - "updated": "2025-08-27 00:57:07", - "updated_at": 1756256227510, - "created": "2013-09-09 10:10:06", - "created_at": 1378721406014, - "link": "https://music.163.com/#/discover/toplist?id=3778678" - }, - { - "id": 991319590, - "name": "网易云中文说唱榜", - "description": "网易云原创说唱音乐人作品官方榜单,每周五更新。以网易云用户一周播放热度为主,收录2个月内发行的原创说唱作品,按照综合数据排名取前50名。申请网易音乐人:http://music.163.com/nmusician", - "cover": "https://p1.music.126.net/GgHbgDfGXHpE2YTchU7IvA==/109951171510498108.jpg", - "update_frequency": "每周五更新", - "updated": "2025-08-22 02:45:48", - "updated_at": 1755830748504, - "created": "2017-11-10 05:06:29", - "created_at": 1510290389440, - "link": "https://music.163.com/#/discover/toplist?id=991319590" - }, - { - "id": 71384707, - "name": "网易云古典榜", - "description": "网易云用户一周内收听所有古典音乐官方TOP排行榜,每周四更新。", - "cover": "https://p1.music.126.net/urByD_AmfBDBrs7fA9-O8A==/109951167976973225.jpg", - "update_frequency": "每周四更新", - "updated": "2025-08-21 02:59:09", - "updated_at": 1755745149157, - "created": "2015-05-07 03:22:00", - "created_at": 1430968920537, - "link": "https://music.163.com/#/discover/toplist?id=71384707" - }, - { - "id": 1978921795, - "name": "网易云电音榜", - "description": "网易云用户一周内收听电子音乐官方TOP排行榜,每周五更新。喜力星电音,用先锋电音带你解锁全新维度和体验!", - "cover": "https://p1.music.126.net/hXGObvXfsGtFjFvRhOYAkA==/109951170091888741.jpg", - "update_frequency": "每周五更新", - "updated": "2025-08-22 09:07:49", - "updated_at": 1755853669156, - "created": "2017-11-16 09:47:12", - "created_at": 1510825632233, - "link": "https://music.163.com/#/discover/toplist?id=1978921795" - }, - { - "id": 14028249541, - "name": "网易云全球说唱榜", - "description": "想聆听世界的说唱节奏?全球说唱榜每周五更新,聚焦华语地区以外的优秀说唱作品。根据云音乐用户每周播放热度数据,按照综合数据排名取前 50 名。", - "cover": "https://p1.music.126.net/0hhFjP6WyIjHYDXKW5E7BA==/109951171535150782.jpg", - "update_frequency": "每周五更新", - "updated": "2025-08-22 01:58:14", - "updated_at": 1755827894399, - "created": "2025-07-24 06:09:26", - "created_at": 1753337366883, - "link": "https://music.163.com/#/discover/toplist?id=14028249541" - }, - { - "id": 13372522766, - "name": "潮流风向榜", - "description": "精心挑选云音乐极具声量的音乐作品,呈现歌曲真实热度趋势,榜单每日更新。", - "cover": "https://p1.music.126.net/dIKA5e7jCncz2Br1Toxgaw==/109951170621574552.jpg", - "update_frequency": "更新74首", - "updated": "2025-08-27 04:05:55", - "updated_at": 1756267555368, - "created": "2025-02-26 06:01:33", - "created_at": 1740549693794, - "link": "https://music.163.com/#/discover/toplist?id=13372522766" - }, - { - "id": 12911403728, - "name": "音乐合伙人推荐榜", - "description": "音乐合伙人近一个月内推荐过的歌曲官方TOP排行榜,每周一更新。 跟随音乐合伙人的步伐,一起发现那些隐藏的音乐瑰宝。", - "cover": "https://p1.music.126.net/s6ITpmGjKbyDpi7DPkqd2w==/109951170187827373.jpg", - "update_frequency": "每周一更新", - "updated": "2025-08-25 04:06:02", - "updated_at": 1756094762192, - "created": "2024-11-25 07:14:30", - "created_at": 1732518870190, - "link": "https://music.163.com/#/discover/toplist?id=12911403728" - }, - { - "id": 12911589513, - "name": "音乐合伙人热歌榜", - "description": "音乐合伙人近一周评定过的高分热歌官方TOP排行榜,每周一更新。 跟随音乐合伙人的步伐,一起发现那些隐藏的音乐瑰宝。", - "cover": "https://p1.music.126.net/RgYxQmB-ZUjkMRo2N1jWnQ==/109951170187823494.jpg", - "update_frequency": "每周一更新", - "updated": "2025-08-25 04:05:58", - "updated_at": 1756094758751, - "created": "2024-11-25 07:13:46", - "created_at": 1732518826543, - "link": "https://music.163.com/#/discover/toplist?id=12911589513" - }, - { - "id": 12911619970, - "name": "音乐合伙人留名榜", - "description": "音乐合伙人近一个月内留名过的所有歌曲官方TOP排行榜,每周一更新。 跟随音乐合伙人的步伐,一起发现那些隐藏的音乐瑰宝。", - "cover": "https://p1.music.126.net/aJJzGIxhkVaD7dX0XBNUnw==/109951170187831145.jpg", - "update_frequency": "每周一更新", - "updated": "2025-08-25 04:05:45", - "updated_at": 1756094745722, - "created": "2024-11-25 07:12:50", - "created_at": 1732518770868, - "link": "https://music.163.com/#/discover/toplist?id=12911619970" - }, - { - "id": 12911379734, - "name": "音乐合伙人高分新歌榜", - "description": "音乐合伙人近期评定过的所有新歌(一个月内最新发行)官方TOP排行榜,每周一更新。 跟随音乐合伙人的步伐,一起发现那些隐藏的音乐瑰宝。", - "cover": "https://p1.music.126.net/bfk15bvanhdPFU7yjPFgWA==/109951170187832038.jpg", - "update_frequency": "每周一更新", - "updated": "2025-08-25 04:05:50", - "updated_at": 1756094750117, - "created": "2024-11-25 07:11:53", - "created_at": 1732518713161, - "link": "https://music.163.com/#/discover/toplist?id=12911379734" - }, - { - "id": 12768855486, - "name": "音乐合伙人高分榜", - "description": "音乐合伙人的高分歌曲官方榜单,收录近半年来获得音乐合伙人高分推荐的TOP100首歌曲,每日更新。跟随音乐合伙人的步伐,一起发现那些隐藏的音乐瑰宝。", - "cover": "https://p1.music.126.net/fPP5T0Z8Ac15qNvRTcHa6g==/109951170074028970.jpg", - "update_frequency": "更新27首", - "updated": "2025-08-27 04:05:47", - "updated_at": 1756267547739, - "created": "2024-10-25 03:51:10", - "created_at": 1729828270342, - "link": "https://music.163.com/#/discover/toplist?id=12768855486" - }, - { - "id": 5453912201, - "name": "黑胶VIP爱听榜", - "description": "云音乐站内会员播放热度TOP100的歌曲,每周四更新。\n黑胶们都爱听什么歌曲?\n热门好歌一站式收听,让你念念不忘~\n做尊贵黑胶,畅听品味好歌~", - "cover": "https://p1.music.126.net/qo6-o9n5AhMjNyejev38-A==/109951169743111905.jpg", - "update_frequency": "每周四更新", - "updated": "2025-08-21 10:05:01", - "updated_at": 1755770701110, - "created": "2021-01-08 06:30:24", - "created_at": 1610087424470, - "link": "https://music.163.com/#/discover/toplist?id=5453912201" - }, - { - "id": 71385702, - "name": "网易云ACG榜", - "description": "网易云用户一周内收听所有ACG音乐官方TOP排行榜,每周四更新。", - "cover": "https://p1.music.126.net/na1kEeCS1iZEkzOrs9r_9g==/109951167976973667.jpg", - "update_frequency": "每周四更新", - "updated": "2025-08-21 04:05:02", - "updated_at": 1755749102516, - "created": "2015-05-07 03:22:15", - "created_at": 1430968935040, - "link": "https://music.163.com/#/discover/toplist?id=71385702" - }, - { - "id": 745956260, - "name": "网易云韩语榜", - "description": "网易云用户一周内收听所有韩语歌曲官方TOP排行榜,每周四更新。", - "cover": "https://p1.music.126.net/5oN9YaFznwNGXkmi8i2Ytw==/109951167430864741.jpg", - "update_frequency": "每周四更新", - "updated": "2025-08-21 04:05:01", - "updated_at": 1755749101352, - "created": "2017-05-31 03:34:51", - "created_at": 1496201691281, - "link": "https://music.163.com/#/discover/toplist?id=745956260" - }, - { - "id": 180106, - "name": "UK排行榜周榜", - "description": "UK排行榜", - "cover": "https://p1.music.126.net/fhAqiflLy3eU-ldmBQByrg==/109951165613082765.jpg", - "update_frequency": "每天更新", - "updated": "2025-08-25 03:59:06", - "updated_at": 1756094346206, - "created": "2013-02-19 02:09:26", - "created_at": 1361239766844, - "link": "https://music.163.com/#/discover/toplist?id=180106" - }, - { - "id": 60198, - "name": "美国Billboard榜", - "description": "美国Billboard排行榜", - "cover": "https://p1.music.126.net/rwRsVIJHQ68gglhA6TNEYA==/109951165611413732.jpg", - "update_frequency": "刚刚更新", - "updated": "2025-08-27 03:38:38", - "updated_at": 1756265918370, - "created": "2013-01-22 02:51:16", - "created_at": 1358823076818, - "link": "https://music.163.com/#/discover/toplist?id=60198" - }, - { - "id": 3812895, - "name": "Beatport全球电子舞曲榜", - "description": "Beatport全球电子舞曲排行榜TOP100(本榜每周三更新)", - "cover": "https://p1.music.126.net/oT-RHuPBJiD7WMoU7WG5Rw==/109951166093489621.jpg", - "update_frequency": "更新20首", - "updated": "2025-08-27 02:29:37", - "updated_at": 1756261777726, - "created": "2013-09-11 08:03:09", - "created_at": 1378886589466, - "link": "https://music.163.com/#/discover/toplist?id=3812895" - }, - { - "id": 21845217, - "name": "KTV唛榜", - "description": "KTV唛榜是目前国内首个以全国超过200家KTV点歌平台真实数据的当红歌曲榜单。所涉及的KTV店铺覆盖全国近100多个城市,囊括一、二、三线各级城市及地区。在综合全国各地KTV点唱数据的前提下进行汇总与统计。为了保证信息的及时性,唛榜每周五更新。提供给K迷们最新和最准确的数据。", - "cover": "https://p1.music.126.net/5wDP78s43ydVTKt62C8OjQ==/109951165613100063.jpg", - "update_frequency": "每周五更新", - "updated": "2021-11-26 09:56:43", - "updated_at": 1637920603975, - "created": "2014-07-18 03:11:33", - "created_at": 1405653093230, - "link": "https://music.163.com/#/discover/toplist?id=21845217" - }, - { - "id": 60131, - "name": "日本Oricon榜", - "description": "日本Oricon数字单曲周榜,每周三更新,欢迎关注。", - "cover": "https://p1.music.126.net/aXUPgImt8hhf4cMUZEjP4g==/109951165611417794.jpg", - "update_frequency": "每天更新", - "updated": "2025-08-22 02:15:24", - "updated_at": 1755828924438, - "created": "2013-01-08 08:51:24", - "created_at": 1357635084874, - "link": "https://music.163.com/#/discover/toplist?id=60131" - }, - { - "id": 2809513713, - "name": "网易云欧美热歌榜", - "description": "网易云用户一周内收听所有欧美歌曲官方TOP排行榜,每周四更新。\nWestern Hit Chart (updated every Thursday)", - "cover": "https://p1.music.126.net/70_EO_Dc7NT_hhfvsapzcQ==/109951167430862162.jpg", - "update_frequency": "每周四更新", - "updated": "2025-08-21 15:44:14", - "updated_at": 1755791054932, - "created": "2019-05-22 02:49:33", - "created_at": 1558493373769, - "link": "https://music.163.com/#/discover/toplist?id=2809513713" - }, - { - "id": 2809577409, - "name": "网易云欧美新歌榜", - "description": "网易云用户一周内收听所有欧美新歌(一月内最新发行)官方TOP排行榜,每天更新。\nWestern New Release Chart (new songs released in last 30 days, updated daily)\n", - "cover": "https://p1.music.126.net/0lPWpI9Ejn1OiW2LSbg-qw==/109951167430863224.jpg", - "update_frequency": "更新17首", - "updated": "2025-08-27 07:16:02", - "updated_at": 1756278962152, - "created": "2019-05-22 02:46:54", - "created_at": 1558493214795, - "link": "https://music.163.com/#/discover/toplist?id=2809577409" - }, - { - "id": 27135204, - "name": "法国 NRJ Vos Hits 周榜", - "description": "法国NRJ电台(national Radio de Jeunes)成立于1981年,总部位于法国巴黎。是法国最受欢迎的音乐电台和听众最多的广播电台之一。NRJ音乐奖素有法国的“格莱美”之称。此榜单针对NRJ电台法国本土热门歌曲排行。【每周五更新】", - "cover": "https://p1.music.126.net/-fyzrPWd06FfWl_0JDAxMQ==/109951165613108584.jpg", - "update_frequency": "每周五更新", - "updated": "2025-08-22 02:15:42", - "updated_at": 1755828942531, - "created": "2014-09-04 10:03:33", - "created_at": 1409825013948, - "link": "https://music.163.com/#/discover/toplist?id=27135204" - }, - { - "id": 3001835560, - "name": "网易云ACG动画榜", - "description": "网易云中每天热度上升最快的100首ACG动画单曲,每日更新。", - "cover": "https://p1.music.126.net/SkGlKQ6acixthb77VlD9eQ==/109951164432300406.jpg", - "update_frequency": "更新84首", - "updated": "2025-08-27 04:05:09", - "updated_at": 1756267509031, - "created": "2019-09-27 02:03:58", - "created_at": 1569549838610, - "link": "https://music.163.com/#/discover/toplist?id=3001835560" - }, - { - "id": 3001795926, - "name": "网易云ACG游戏榜", - "description": "网易云中每天热度上升最快的100首ACG游戏单曲,每日更新。", - "cover": "https://p1.music.126.net/hivOOHMwEmnn9s_6rgZwEQ==/109951164432303700.jpg", - "update_frequency": "更新87首", - "updated": "2025-08-27 04:05:18", - "updated_at": 1756267518248, - "created": "2019-09-27 02:04:56", - "created_at": 1569549896656, - "link": "https://music.163.com/#/discover/toplist?id=3001795926" - }, - { - "id": 3001890046, - "name": "网易云ACG VOCALOID榜", - "description": "", - "cover": "https://p1.music.126.net/Ag7RyRCYiINcd9EtRXf6xA==/109951164432303690.jpg", - "update_frequency": "更新87首", - "updated": "2025-08-27 04:05:27", - "updated_at": 1756267527413, - "created": "2019-09-27 02:05:25", - "created_at": 1569549925472, - "link": "https://music.163.com/#/discover/toplist?id=3001890046" - }, - { - "id": 5059644681, - "name": "网易云日语榜", - "description": "网易云用户一周内收听所有日语歌曲官方TOP排行榜,每周二更新。", - "cover": "https://p1.music.126.net/YFBFNI2F-4BveUpv6FKFuw==/109951167430864069.jpg", - "update_frequency": "每周二更新", - "updated": "2025-08-26 06:05:02", - "updated_at": 1756188302867, - "created": "2020-06-11 08:10:00", - "created_at": 1591863000459, - "link": "https://music.163.com/#/discover/toplist?id=5059644681" - }, - { - "id": 5059633707, - "name": "网易云摇滚榜", - "description": "网易云用户一周内收听所有摇滚歌曲官方TOP排行榜,每周五更新。", - "cover": "https://p1.music.126.net/LjkX2hktgFD1NXc3W6w0sA==/109951170048522513.jpg", - "update_frequency": "每周五更新", - "updated": "2025-08-22 09:12:43", - "updated_at": 1755853963904, - "created": "2020-06-11 08:13:33", - "created_at": 1591863213389, - "link": "https://music.163.com/#/discover/toplist?id=5059633707" - }, - { - "id": 5059642708, - "name": "网易云国风榜", - "description": "网易云用户一周内收听所有国风歌曲官方TOP排行榜,每周五更新。", - "cover": "https://p1.music.126.net/kTJC5OBhg8I477X_ZmXyDQ==/109951168539740982.jpg", - "update_frequency": "每周五更新", - "updated": "2025-08-22 03:10:57", - "updated_at": 1755832257607, - "created": "2020-06-11 08:14:18", - "created_at": 1591863258438, - "link": "https://music.163.com/#/discover/toplist?id=5059642708" - }, - { - "id": 5338990334, - "name": "潜力爆款榜", - "description": "全民一起PICK潜力好歌,每周二更新", - "cover": "https://p1.music.126.net/Mi4QPklg1mtbWAfq74tEqQ==/109951165498334721.jpg", - "update_frequency": "每周二更新", - "updated": "2025-08-26 04:05:32", - "updated_at": 1756181132964, - "created": "2020-11-17 06:24:34", - "created_at": 1605594274077, - "link": "https://music.163.com/#/discover/toplist?id=5338990334" - }, - { - "id": 5059661515, - "name": "网易云民谣榜", - "description": "网易云用户一周内收听所有民谣歌曲官方TOP排行榜,每周五更新。", - "cover": "https://p1.music.126.net/Xe9qLTAqtBAWX_hPgFHMyw==/109951170048510929.jpg", - "update_frequency": "每周五更新", - "updated": "2025-08-22 08:39:36", - "updated_at": 1755851976839, - "created": "2020-06-11 08:10:52", - "created_at": 1591863052757, - "link": "https://music.163.com/#/discover/toplist?id=5059661515" - }, - { - "id": 6688069460, - "name": "听歌识曲榜", - "description": "网易云音乐站内歌曲按用户“听歌识曲”次数排列,每周四更新", - "cover": "https://p1.music.126.net/wJVUAiUuykKk7yGbQxDBug==/109951167430857712.jpg", - "update_frequency": "每周四更新", - "updated": "2025-08-21 15:35:02", - "updated_at": 1755790502462, - "created": "2021-03-31 08:45:54", - "created_at": 1617180354803, - "link": "https://music.163.com/#/discover/toplist?id=6688069460" - }, - { - "id": 6723173524, - "name": "网络热歌榜", - "description": "网罗一周热门网络歌曲,反映云音乐用户近一周网络热歌收听趋势。每周五更新。", - "cover": "https://p1.music.126.net/_kSxOPqQ5J5etC5DKTFwNA==/109951170048519530.jpg", - "update_frequency": "每周五更新", - "updated": "2025-08-22 01:59:18", - "updated_at": 1755827958008, - "created": "2021-04-22 02:41:46", - "created_at": 1619059306654, - "link": "https://music.163.com/#/discover/toplist?id=6723173524" - }, - { - "id": 6732051320, - "name": "俄语榜", - "description": "网易云音乐用户一周内收听所有俄罗斯语歌曲官方TOP排行榜,每周四更新。", - "cover": "https://p1.music.126.net/HbJ0BK5doY4I4pEMY6-FQw==/109951167430852698.jpg", - "update_frequency": "每周四更新", - "updated": "2025-08-21 04:05:27", - "updated_at": 1755749127585, - "created": "2021-04-28 04:05:12", - "created_at": 1619582712108, - "link": "https://music.163.com/#/discover/toplist?id=6732051320" - }, - { - "id": 6732014811, - "name": "越南语榜", - "description": "网易云音乐用户一周内收听所有越南语歌曲官方TOP排行榜,每周四更新。", - "cover": "https://p1.music.126.net/N-Y5maLGWgrowt3TE6RtSg==/109951167430857045.jpg", - "update_frequency": "每周四更新", - "updated": "2025-08-21 04:05:28", - "updated_at": 1755749128002, - "created": "2021-04-28 04:05:49", - "created_at": 1619582749349, - "link": "https://music.163.com/#/discover/toplist?id=6732014811" - }, - { - "id": 6886768100, - "name": "中文慢摇DJ榜", - "description": "搜索“DJ”,进入慢摇DJ专区,探索更多网络热歌!", - "cover": "https://p1.music.126.net/w_01BfDU012ojxnzLO6tYw==/109951167977358686.jpg", - "update_frequency": "刚刚更新", - "updated": "2025-08-27 04:00:00", - "updated_at": 1756267200565, - "created": "2021-07-28 10:09:59", - "created_at": 1627466999260, - "link": "https://music.163.com/#/discover/toplist?id=6886768100" - }, - { - "id": 6939992364, - "name": "俄罗斯top hit流行音乐榜", - "description": "top hit榜根据俄罗斯及全球400多个无线广播的音乐播放量和YouTube播放量计算得来,每周一更新。", - "cover": "https://p1.music.126.net/KLVO8PxVZzOoLdWQQNyprA==/109951166327316568.jpg", - "update_frequency": "每周五更新", - "updated": "2025-08-22 06:10:23", - "updated_at": 1755843023964, - "created": "2021-08-27 03:30:02", - "created_at": 1630035002268, - "link": "https://music.163.com/#/discover/toplist?id=6939992364" - }, - { - "id": 7095271308, - "name": "泰语榜", - "description": "网易云音乐用户一周内收听所有泰语歌曲官方TOP排行榜,每周四更新。", - "cover": "https://p1.music.126.net/4W0WBHBgwYlYfRniuyL47A==/109951167430843284.jpg", - "update_frequency": "每周四更新", - "updated": "2025-08-21 02:26:07", - "updated_at": 1755743167588, - "created": "2021-11-29 06:22:17", - "created_at": 1638166937809, - "link": "https://music.163.com/#/discover/toplist?id=7095271308" - }, - { - "id": 7356827205, - "name": "BEAT排行榜", - "description": "嘿~朋友,欢迎来到本周的Beat排行榜\n我们挑选了近一周内热门的Beat作品,一起来感受下大家近期的“口味”吧!\n每周都会更新哦,记得按下收藏,我每天都会在这里等你来与我交流!~\n\n关于Beat的必备小知识\nQ1.什么是Beat?\nBeat即节拍,特指嘻哈音乐中的伴奏,现在也可指所有流行音乐的伴奏\nQ2.Beat有什么用?\n在Beat的帮助下,你只需要填词演唱即可完成一首歌曲的创作,而且Beat也可以作为各种流媒体的背景音乐或是多场景现场演出的得力助手,不同风格的Beat还能为你的音乐创作提供灵感哦~\n搜索关注“BEATSOUL激灵”网易云官号,探索更多炸裂音乐内容~", - "cover": "https://p1.music.126.net/yhzlQJCJ9NcT4MvJBG_HgQ==/109951167977014958.jpg", - "update_frequency": "每周四更新", - "updated": "2025-08-21 12:05:01", - "updated_at": 1755777901037, - "created": "2022-03-29 11:39:58", - "created_at": 1648553998273, - "link": "https://music.163.com/#/discover/toplist?id=7356827205" - }, - { - "id": 7325478166, - "name": "星云榜VOL.29 Addison Rae新专来袭,寻找最真实的自己", - "description": "精心评审,专业推荐。每周五更新,为你呈现宝藏新歌。\n1、《Aquamarinee》歌手:Addison Rae\n2、《羽毛剑》歌手:秦凡淇\n3、《Take me back》歌手:HAIM\n4、《妈妈的眼睛》歌手:张震岳\n5、《25岁永不停下》歌手:张醒婵\n6、《雨季症候》歌手:SHARK卫彬月\n7、《山东王FREESTYLE》歌手:华云龙KLE\n8、《LOVE I NEED》歌手:陈瑜Estelle\n9、《FFFFF》歌手:刘柏辛Lexie\n10、《Vipaśyanā》歌手:Namunong\n本期封面:Addison Rae,Aquamarine", - "cover": "https://p2.music.126.net/u440jFG0N5i06C9ejOeMCQ==/109951171381091309.jpg", - "update_frequency": "每周五更新", - "updated": "2025-06-30 08:17:26", - "updated_at": 1751271446032, - "created": "2022-03-09 03:24:46", - "created_at": 1646796286440, - "link": "https://music.163.com/#/discover/toplist?id=7325478166" - }, - { - "id": 7603212484, - "name": "LOOK直播歌曲榜", - "description": "LOOK直播好歌共赏,专属你的声音聊愈场。榜单选取符合条件且近7日热度最高的前50首歌曲,每周二更新。", - "cover": "https://p2.music.126.net/u-RQC-LyY0aoeseRumJ14A==/109951167977730469.jpg", - "update_frequency": "每周二更新", - "updated": "2024-05-07 13:23:03", - "updated_at": 1715088183913, - "created": "2022-08-23 01:54:56", - "created_at": 1661219696017, - "link": "https://music.163.com/#/discover/toplist?id=7603212484" - }, - { - "id": 7775163417, - "name": "赏音榜", - "description": "云音乐歌曲赏音榜,以让用户鉴赏到更多潜力好歌为目的,以用户对歌曲互动热度为核心,按照综合数据排名取前100名,每日更新", - "cover": "https://p2.music.126.net/m9hQzC-d5wefBipedNPaHg==/109951168178601971.jpg", - "update_frequency": "更新92首", - "updated": "2025-08-27 04:05:36", - "updated_at": 1756267536926, - "created": "2022-11-28 06:46:19", - "created_at": 1669617979380, - "link": "https://music.163.com/#/discover/toplist?id=7775163417" - }, - { - "id": 7785123708, - "name": "黑胶VIP新歌榜", - "description": "云音乐站内播放热度TOP50的7日内新晋会员歌曲,每日更新。\n更适合黑胶体质的新歌榜单来啦!\n耳机分你一只,新曲一起来听~\n成为尊贵黑胶,不错过每一首VIP新歌!", - "cover": "https://p2.music.126.net/vjitpkT9nXBCth6tvdDMWg==/109951169743115266.jpg", - "update_frequency": "更新33首", - "updated": "2025-08-27 04:05:38", - "updated_at": 1756267538662, - "created": "2022-12-02 10:51:16", - "created_at": 1669978276103, - "link": "https://music.163.com/#/discover/toplist?id=7785123708" - }, - { - "id": 7785066739, - "name": "黑胶VIP热歌榜", - "description": "云音乐站内播放和付费热度TOP50的会员歌曲,每日更新。\n更适合黑胶体质的热歌榜单来啦!\n哪首是你的单曲循环?\n成为尊贵黑胶,随心畅听热门好歌!", - "cover": "https://p2.music.126.net/Ay3mLgQ9weG_c8JjYrD-Bw==/109951169743106495.jpg", - "update_frequency": "刚刚更新", - "updated": "2025-08-27 04:05:37", - "updated_at": 1756267537688, - "created": "2022-12-02 10:51:31", - "created_at": 1669978291024, - "link": "https://music.163.com/#/discover/toplist?id=7785066739" - }, - { - "id": 7785091694, - "name": "黑胶VIP爱搜榜", - "description": "云音乐站内会员搜索播放热度TOP50的歌曲,每日更新。\n更适合黑胶体质的搜歌榜单来啦!\n热搜好歌一网打尽,只为有品位的你~\n成为尊贵黑胶,你搜我听畅听不停!", - "cover": "https://p2.music.126.net/R7DtZqNraesnsiaIKvzTHA==/109951169743112799.jpg", - "update_frequency": "更新36首", - "updated": "2025-08-27 04:05:42", - "updated_at": 1756267542318, - "created": "2022-12-02 10:51:43", - "created_at": 1669978303210, - "link": "https://music.163.com/#/discover/toplist?id=7785091694" - }, - { - "id": 8246775932, - "name": "实时热度榜", - "description": "每天9-23点为你精选当下歌曲热度最高的歌曲", - "cover": "https://p2.music.126.net/U7ZbdpWzRdmZVr6Khn_4ag==/109951168673982478.jpg", - "update_frequency": "刚刚更新", - "updated": "2025-08-27 13:15:01", - "updated_at": 1756300501119, - "created": "2023-03-20 02:39:59", - "created_at": 1679279999154, - "link": "https://music.163.com/#/discover/toplist?id=8246775932" - }, - { - "id": 8537588450, - "name": "喜力®星电音派对潮音榜", - "description": "乐无界,越未来!《星电音联盟》歌曲官方榜单,每周一更新,让云村村民们随时随地躁起高燃派对氛围!喜力®星电音构建狂欢永不停歇的新奇电音宇宙,激活潮流基因,释放先锋灵感,跨维开启奇妙电音之旅!", - "cover": "https://p2.music.126.net/HVu2hGYvzN5XBuvFc_4Bgg==/109951168730309120.jpg", - "update_frequency": "每周五更新", - "updated": "2024-09-16 04:05:30", - "updated_at": 1726459530378, - "created": "2023-07-07 02:48:39", - "created_at": 1688698119437, - "link": "https://music.163.com/#/discover/toplist?id=8537588450" - }, - { - "id": 8661209031, - "name": "乐夏榜", - "description": "听乐夏,上网易云,一头扎进爱音乐的人群! 综艺《乐队的夏天3》官方榜单,每周一更新。和三星折叠屏手机一起畅听《乐队的夏天3》官方榜单,折叠看三星,五代更来劲。", - "cover": "https://p2.music.126.net/RlStCmE97y0xYFk7rS3Zww==/109951168864907822.jpg", - "update_frequency": "每周一更新", - "updated": "2025-08-25 04:05:40", - "updated_at": 1756094740529, - "created": "2023-08-16 09:47:27", - "created_at": 1692179247425, - "link": "https://music.163.com/#/discover/toplist?id=8661209031" - }, - { - "id": 8703179781, - "name": "特斯拉车友爱听榜", - "description": null, - "cover": "https://p2.music.126.net/UL8dhobSa3TR6Wd1JmWe_g==/109951168924385363.jpg", - "update_frequency": "每周一更新", - "updated": "2025-08-25 08:05:04", - "updated_at": 1756109104224, - "created": "2023-08-31 04:29:59", - "created_at": 1693456199735, - "link": "https://music.163.com/#/discover/toplist?id=8703179781" - }, - { - "id": 8703052295, - "name": "理想车友爱听榜", - "description": null, - "cover": "https://p2.music.126.net/U--PWdWupY1ER5cVSjr1jQ==/109951168928365496.jpg", - "update_frequency": "每周一更新", - "updated": "2025-08-25 08:05:04", - "updated_at": 1756109104985, - "created": "2023-08-31 04:38:29", - "created_at": 1693456709598, - "link": "https://music.163.com/#/discover/toplist?id=8703052295" - }, - { - "id": 8702582160, - "name": "比亚迪车友爱听榜", - "description": null, - "cover": "https://p2.music.126.net/S1OG-OLTaofa3HfrHW48kA==/109951168924393585.jpg", - "update_frequency": "每周一更新", - "updated": "2025-08-25 08:05:03", - "updated_at": 1756109103855, - "created": "2023-08-31 04:38:42", - "created_at": 1693456722262, - "link": "https://music.163.com/#/discover/toplist?id=8702582160" - }, - { - "id": 8703220480, - "name": "蔚来车友爱听榜", - "description": null, - "cover": "https://p2.music.126.net/r9kBQNsOro1EAB82Ol51WQ==/109951168924380971.jpg", - "update_frequency": "每周一更新", - "updated": "2025-08-25 08:05:02", - "updated_at": 1756109102267, - "created": "2023-08-31 04:38:56", - "created_at": 1693456736086, - "link": "https://music.163.com/#/discover/toplist?id=8703220480" - }, - { - "id": 8702982391, - "name": "极氪车友爱听榜", - "description": null, - "cover": "https://p2.music.126.net/Cu0RXoKewSPM9Gyc7Cp8jw==/109951168924391596.jpg", - "update_frequency": "每周一更新", - "updated": "2025-08-25 08:05:03", - "updated_at": 1756109103634, - "created": "2023-08-31 04:39:19", - "created_at": 1693456759762, - "link": "https://music.163.com/#/discover/toplist?id=8702982391" - }, - { - "id": 8532443277, - "name": "蛋仔派对听歌榜", - "description": "来自蛋仔岛的热播歌曲速递,网易《蛋仔派对》官方榜单,每周五更新。云村村民们,和蛋仔们一起随歌摇摆吧!", - "cover": "https://p2.music.126.net/TMb0be5QLMZKOFeuOKT4tg==/109951168717283910.jpg", - "update_frequency": "每周五更新", - "updated": "2025-08-22 04:05:44", - "updated_at": 1755835544365, - "created": "2023-07-05 02:32:04", - "created_at": 1688524324879, - "link": "https://music.163.com/#/discover/toplist?id=8532443277" - }, - { - "id": 9651277674, - "name": "AI歌曲榜", - "description": "精心挑选每日最新最热AI生成歌曲,榜单每日更新,一起感受AI的独特魅力吧!", - "cover": "https://p2.music.126.net/M0m6GeZ1Y8Osz9jqxaW8Wg==/109951169462048035.jpg", - "update_frequency": "更新12首", - "updated": "2025-08-27 04:05:43", - "updated_at": 1756267543655, - "created": "2024-04-02 10:25:12", - "created_at": 1712053512213, - "link": "https://music.163.com/#/discover/toplist?id=9651277674" - }, - { - "id": 10131772880, - "name": "昊铂车友爱听榜", - "description": null, - "cover": "https://p2.music.126.net/EL7H4rkKejZY7Uv54EFNXg==/109951169655010112.jpg", - "update_frequency": "每周一更新", - "updated": "2025-08-25 08:05:01", - "updated_at": 1756109101438, - "created": "2024-06-04 08:50:00", - "created_at": 1717491000945, - "link": "https://music.163.com/#/discover/toplist?id=10131772880" - }, - { - "id": 10162841534, - "name": "埃安车友爱听榜", - "description": "埃安车友平时都在听什么??", - "cover": "https://p2.music.126.net/FcP1U6Bck0wPKqd0XgBwSQ==/109951169679731241.jpg", - "update_frequency": "每周一更新", - "updated": "2025-08-25 08:05:03", - "updated_at": 1756109103115, - "created": "2024-06-12 05:31:44", - "created_at": 1718170304691, - "link": "https://music.163.com/#/discover/toplist?id=10162841534" - }, - { - "id": 12225155968, - "name": "欧美R&B榜", - "description": "云音乐用户一周内收听节奏布鲁斯(R&B)官方TOP排行榜,每周五更新。", - "cover": "https://p2.music.126.net/0E6MzYzyA5uvQ4CSoIG2mw==/109951169739660034.jpg", - "update_frequency": "每周五更新", - "updated": "2025-08-22 04:05:46", - "updated_at": 1755835546525, - "created": "2024-06-25 10:14:05", - "created_at": 1719310445382, - "link": "https://music.163.com/#/discover/toplist?id=12225155968" - }, - { - "id": 12344472377, - "name": "黑胶VIP限免榜", - "description": "云音乐站内热度最高的限免播放歌曲TOP50,每日更新。\n人气旋律一听就会爱上!现在马上进入免费模式(点击云音乐首页左上角侧边栏,选择“免费听歌”)畅听全榜吧!", - "cover": "https://p2.music.126.net/WXCSf4ZNcDCdOTY5ixm3Bg==/109951169809318325.jpg", - "update_frequency": "更新11首", - "updated": "2025-08-27 04:05:44", - "updated_at": 1756267544856, - "created": "2024-07-23 08:08:37", - "created_at": 1721722117311, - "link": "https://music.163.com/#/discover/toplist?id=12344472377" - }, - { - "id": 12717025277, - "name": "吉利车友爱听榜", - "description": null, - "cover": "https://p2.music.126.net/XVmZb3JSyrwMgqu9WVz61A==/109951170037568570.jpg", - "update_frequency": "每周一更新", - "updated": "2025-08-25 08:05:00", - "updated_at": 1756109100809, - "created": "2024-10-12 05:44:04", - "created_at": 1728711844151, - "link": "https://music.163.com/#/discover/toplist?id=12717025277" - } - ] -} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/热搜榜单/网易云榜单详情/css/background.css b/frontend/react-app/public/60sapi/热搜榜单/网易云榜单详情/css/background.css deleted file mode 100644 index a4c76f7a..00000000 --- a/frontend/react-app/public/60sapi/热搜榜单/网易云榜单详情/css/background.css +++ /dev/null @@ -1,123 +0,0 @@ -/* 背景样式文件 */ -body { - background: linear-gradient(135deg, #E8F5E8 0%, #F1F8E9 25%, #E0F2F1 50%, #E8F5E8 75%, #F3E5F5 100%); - background-size: 400% 400%; - animation: gradientShift 15s ease infinite; - position: relative; -} - -/* 背景渐变动画 */ -@keyframes gradientShift { - 0% { - background-position: 0% 50%; - } - 50% { - background-position: 100% 50%; - } - 100% { - background-position: 0% 50%; - } -} - -/* 背景装饰元素 */ -body::before { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - radial-gradient(circle at 20% 80%, rgba(76, 175, 80, 0.1) 0%, transparent 50%), - radial-gradient(circle at 80% 20%, rgba(129, 199, 132, 0.1) 0%, transparent 50%), - radial-gradient(circle at 40% 40%, rgba(165, 214, 167, 0.08) 0%, transparent 50%); - pointer-events: none; - z-index: -2; -} - -/* 背景粒子效果 */ -body::after { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: - radial-gradient(2px 2px at 20px 30px, rgba(76, 175, 80, 0.3), transparent), - radial-gradient(2px 2px at 40px 70px, rgba(129, 199, 132, 0.2), transparent), - radial-gradient(1px 1px at 90px 40px, rgba(165, 214, 167, 0.3), transparent), - radial-gradient(1px 1px at 130px 80px, rgba(76, 175, 80, 0.2), transparent), - radial-gradient(2px 2px at 160px 30px, rgba(129, 199, 132, 0.3), transparent); - background-repeat: repeat; - background-size: 200px 100px; - animation: particleFloat 20s linear infinite; - pointer-events: none; - z-index: -1; - opacity: 0.6; -} - -@keyframes particleFloat { - 0% { - transform: translateY(0px); - } - 100% { - transform: translateY(-100px); - } -} - -/* 响应式背景调整 */ -@media (max-width: 768px) { - body::after { - background-size: 150px 75px; - animation-duration: 25s; - } -} - -@media (max-width: 480px) { - body::after { - background-size: 100px 50px; - animation-duration: 30s; - opacity: 0.4; - } -} - -/* 高性能模式 - 减少动画 */ -@media (prefers-reduced-motion: reduce) { - body { - animation: none; - background: linear-gradient(135deg, #E8F5E8 0%, #F1F8E9 50%, #E0F2F1 100%); - } - - body::after { - animation: none; - } - - .title { - animation: none; - } -} - -/* 深色模式支持 */ -@media (prefers-color-scheme: dark) { - body { - background: linear-gradient(135deg, #1B5E20 0%, #2E7D32 25%, #388E3C 50%, #43A047 75%, #4CAF50 100%); - } - - body::before { - background-image: - radial-gradient(circle at 20% 80%, rgba(255, 255, 255, 0.05) 0%, transparent 50%), - radial-gradient(circle at 80% 20%, rgba(255, 255, 255, 0.03) 0%, transparent 50%), - radial-gradient(circle at 40% 40%, rgba(255, 255, 255, 0.02) 0%, transparent 50%); - } - - body::after { - background-image: - radial-gradient(1px 1px at 20px 30px, rgba(255, 255, 255, 0.1), transparent), - radial-gradient(1px 1px at 40px 70px, rgba(255, 255, 255, 0.08), transparent), - radial-gradient(1px 1px at 90px 40px, rgba(255, 255, 255, 0.06), transparent), - radial-gradient(1px 1px at 130px 80px, rgba(255, 255, 255, 0.04), transparent), - radial-gradient(1px 1px at 160px 30px, rgba(255, 255, 255, 0.05), transparent); - opacity: 0.3; - } -} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/热搜榜单/网易云榜单详情/css/style.css b/frontend/react-app/public/60sapi/热搜榜单/网易云榜单详情/css/style.css deleted file mode 100644 index 5f93a361..00000000 --- a/frontend/react-app/public/60sapi/热搜榜单/网易云榜单详情/css/style.css +++ /dev/null @@ -1,483 +0,0 @@ -/* 基础样式重置 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: 'Microsoft YaHei', 'PingFang SC', 'Helvetica Neue', Arial, sans-serif; - line-height: 1.6; - color: #2c3e50; - min-height: 100vh; - overflow-x: hidden; -} - -.container { - max-width: 1200px; - margin: 0 auto; - padding: 20px; - position: relative; - z-index: 1; -} - -/* 头部样式 */ -.header { - text-align: center; - margin-bottom: 40px; - padding: 40px 20px; - background: rgba(255, 255, 255, 0.9); - border-radius: 20px; - backdrop-filter: blur(10px); - box-shadow: 0 8px 32px rgba(76, 175, 80, 0.1); -} - -.title { - font-size: 2.5rem; - font-weight: 700; - background: linear-gradient(135deg, #4CAF50, #81C784); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; - margin-bottom: 10px; - animation: titleGlow 3s ease-in-out infinite alternate; -} - -@keyframes titleGlow { - from { filter: drop-shadow(0 0 5px rgba(76, 175, 80, 0.3)); } - to { filter: drop-shadow(0 0 15px rgba(76, 175, 80, 0.6)); } -} - -.subtitle { - font-size: 1.1rem; - color: #666; - opacity: 0.8; -} - -/* 榜单信息样式 */ -.rank-info { - background: rgba(255, 255, 255, 0.95); - border-radius: 15px; - padding: 25px; - margin-bottom: 30px; - box-shadow: 0 6px 25px rgba(76, 175, 80, 0.1); - border: 1px solid rgba(76, 175, 80, 0.2); -} - -.rank-header { - display: flex; - gap: 20px; - align-items: flex-start; -} - -.rank-cover { - width: 120px; - height: 120px; - border-radius: 12px; - object-fit: cover; - box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2); - flex-shrink: 0; -} - -.rank-details { - flex: 1; -} - -.rank-name { - font-size: 1.8rem; - color: #2c3e50; - margin-bottom: 10px; - font-weight: 600; -} - -.rank-description { - color: #666; - margin-bottom: 15px; - line-height: 1.6; -} - -.rank-meta { - display: flex; - gap: 20px; - flex-wrap: wrap; -} - -.update-time, .update-frequency { - background: linear-gradient(135deg, #E8F5E8, #C8E6C9); - padding: 6px 12px; - border-radius: 20px; - font-size: 0.9rem; - color: #2E7D32; - border: 1px solid rgba(76, 175, 80, 0.3); -} - -/* 控制区域样式 */ -.controls { - background: rgba(255, 255, 255, 0.9); - border-radius: 15px; - padding: 25px; - margin-bottom: 30px; - box-shadow: 0 6px 25px rgba(76, 175, 80, 0.1); -} - -.input-group { - display: flex; - gap: 15px; - align-items: center; - flex-wrap: wrap; -} - -.input-group label { - font-weight: 600; - color: #2c3e50; - min-width: 80px; -} - -#rankId { - flex: 1; - min-width: 200px; - padding: 12px 16px; - border: 2px solid #E0E0E0; - border-radius: 10px; - font-size: 1rem; - transition: all 0.3s ease; - background: rgba(255, 255, 255, 0.9); -} - -#rankId:focus { - outline: none; - border-color: #4CAF50; - box-shadow: 0 0 0 3px rgba(76, 175, 80, 0.1); -} - -.load-btn { - padding: 12px 24px; - background: linear-gradient(135deg, #4CAF50, #66BB6A); - color: white; - border: none; - border-radius: 10px; - font-size: 1rem; - font-weight: 600; - cursor: pointer; - transition: all 0.3s ease; - box-shadow: 0 4px 15px rgba(76, 175, 80, 0.3); -} - -.load-btn:hover { - transform: translateY(-2px); - box-shadow: 0 6px 20px rgba(76, 175, 80, 0.4); -} - -.load-btn:active { - transform: translateY(0); -} - -.load-btn:disabled { - opacity: 0.6; - cursor: not-allowed; - transform: none; -} - -/* 加载动画 */ -.loading { - text-align: center; - padding: 40px; - background: rgba(255, 255, 255, 0.9); - border-radius: 15px; - margin-bottom: 30px; -} - -.spinner { - width: 40px; - height: 40px; - border: 4px solid #E0E0E0; - border-top: 4px solid #4CAF50; - border-radius: 50%; - animation: spin 1s linear infinite; - margin: 0 auto 15px; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -/* 错误提示 */ -.error { - text-align: center; - padding: 30px; - background: rgba(255, 245, 245, 0.95); - border: 2px solid #ffcdd2; - border-radius: 15px; - margin-bottom: 30px; -} - -.error-icon { - font-size: 3rem; - margin-bottom: 15px; -} - -.error-message { - color: #c62828; - margin-bottom: 20px; - font-size: 1.1rem; -} - -.retry-btn { - padding: 10px 20px; - background: #f44336; - color: white; - border: none; - border-radius: 8px; - cursor: pointer; - transition: all 0.3s ease; -} - -.retry-btn:hover { - background: #d32f2f; - transform: translateY(-1px); -} - -/* 歌曲列表样式 */ -.song-list { - background: rgba(255, 255, 255, 0.95); - border-radius: 15px; - padding: 25px; - margin-bottom: 30px; - box-shadow: 0 6px 25px rgba(76, 175, 80, 0.1); -} - -.list-header { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 25px; - padding-bottom: 15px; - border-bottom: 2px solid #E8F5E8; -} - -.list-header h3 { - font-size: 1.5rem; - color: #2c3e50; - font-weight: 600; -} - -.song-count { - background: linear-gradient(135deg, #4CAF50, #66BB6A); - color: white; - padding: 6px 12px; - border-radius: 20px; - font-size: 0.9rem; - font-weight: 600; -} - -/* 歌曲项样式 */ -.song-item { - display: flex; - align-items: center; - padding: 15px; - margin-bottom: 12px; - background: rgba(248, 255, 248, 0.8); - border-radius: 12px; - transition: all 0.3s ease; - border: 1px solid rgba(76, 175, 80, 0.1); - cursor: pointer; -} - -.song-item:hover { - transform: translateY(-2px); - box-shadow: 0 6px 20px rgba(76, 175, 80, 0.15); - background: rgba(232, 245, 232, 0.9); -} - -.song-rank { - font-size: 1.2rem; - font-weight: 700; - color: #4CAF50; - min-width: 40px; - text-align: center; -} - -.song-rank.top3 { - background: linear-gradient(135deg, #FFD700, #FFA000); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; -} - -.song-info { - flex: 1; - margin-left: 15px; -} - -.song-title { - font-size: 1.1rem; - font-weight: 600; - color: #2c3e50; - margin-bottom: 5px; - display: -webkit-box; - -webkit-line-clamp: 1; - -webkit-box-orient: vertical; - overflow: hidden; -} - -.song-artist { - color: #666; - font-size: 0.9rem; - margin-bottom: 3px; -} - -.song-album { - color: #888; - font-size: 0.85rem; -} - -.song-meta { - display: flex; - flex-direction: column; - align-items: flex-end; - gap: 5px; -} - -.song-duration { - color: #666; - font-size: 0.9rem; -} - -.song-popularity { - background: linear-gradient(135deg, #4CAF50, #66BB6A); - color: white; - padding: 3px 8px; - border-radius: 12px; - font-size: 0.8rem; - font-weight: 600; -} - -/* 返回按钮 */ -.back-to-list { - text-align: center; - margin: 30px 0; -} - -.back-btn { - display: inline-flex; - align-items: center; - gap: 8px; - padding: 12px 24px; - background: linear-gradient(135deg, #81C784, #A5D6A7); - color: white; - text-decoration: none; - border-radius: 10px; - font-weight: 600; - transition: all 0.3s ease; - box-shadow: 0 4px 15px rgba(129, 199, 132, 0.3); -} - -.back-btn:hover { - transform: translateY(-2px); - box-shadow: 0 6px 20px rgba(129, 199, 132, 0.4); -} - -/* 页脚 */ -.footer { - text-align: center; - padding: 30px 20px; - background: rgba(255, 255, 255, 0.9); - border-radius: 15px; - margin-top: 40px; - color: #666; - backdrop-filter: blur(10px); -} - -/* 响应式设计 */ -@media (max-width: 768px) { - .container { - padding: 15px; - } - - .title { - font-size: 2rem; - } - - .rank-header { - flex-direction: column; - text-align: center; - } - - .rank-cover { - width: 100px; - height: 100px; - margin: 0 auto 15px; - } - - .input-group { - flex-direction: column; - align-items: stretch; - } - - .input-group label { - min-width: auto; - margin-bottom: 5px; - } - - #rankId { - min-width: auto; - margin-bottom: 10px; - } - - .song-item { - flex-direction: column; - text-align: center; - gap: 10px; - } - - .song-info { - margin-left: 0; - } - - .song-meta { - align-items: center; - flex-direction: row; - justify-content: center; - } - - .list-header { - flex-direction: column; - gap: 10px; - text-align: center; - } -} - -@media (max-width: 480px) { - .title { - font-size: 1.8rem; - } - - .header { - padding: 30px 15px; - } - - .rank-info, .controls, .song-list { - padding: 20px; - } - - .song-item { - padding: 12px; - } -} - -/* 平板端适配 */ -@media (min-width: 769px) and (max-width: 1024px) { - .container { - padding: 25px; - } - - .song-item { - padding: 18px; - } - - .rank-cover { - width: 110px; - height: 110px; - } -} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/热搜榜单/网易云榜单详情/index.html b/frontend/react-app/public/60sapi/热搜榜单/网易云榜单详情/index.html deleted file mode 100644 index 9215b81c..00000000 --- a/frontend/react-app/public/60sapi/热搜榜单/网易云榜单详情/index.html +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - 网易云榜单详情 - - - - -
    -
    -

    🎵 网易云榜单详情

    -

    发现音乐的魅力

    -
    - - - -
    -
    - - - -
    -
    - - - - - - - - -
    - -
    -

    © 2025 网易云榜单详情 - 数据来源于官方API

    -
    - - - - \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/热搜榜单/网易云榜单详情/js/script.js b/frontend/react-app/public/60sapi/热搜榜单/网易云榜单详情/js/script.js deleted file mode 100644 index 0ff2eb10..00000000 --- a/frontend/react-app/public/60sapi/热搜榜单/网易云榜单详情/js/script.js +++ /dev/null @@ -1,349 +0,0 @@ -// 网易云榜单详情 JavaScript -class NeteaseMusicRankDetail { - constructor() { - this.apiUrls = []; - this.currentApiIndex = 0; - this.rankData = null; - this.init(); - } - - async init() { - try { - await this.loadApiUrls(); - this.bindEvents(); - this.checkUrlParams(); - } catch (error) { - console.error('初始化失败:', error); - this.showError('初始化失败,请刷新页面重试'); - } - } - - // 加载API接口列表 - async loadApiUrls() { - try { - const response = await fetch('./接口集合.json'); - if (!response.ok) { - throw new Error('无法加载API接口配置'); - } - this.apiUrls = await response.json(); - console.log('API接口加载成功:', this.apiUrls); - } catch (error) { - console.error('加载API接口失败:', error); - // 使用默认接口 - this.apiUrls = [ - 'https://60s-cf.viki.moe', - 'https://60s.viki.moe', - 'https://60s.b23.run', - 'https://60s.114128.xyz', - 'https://60s-cf.114128.xyz' - ]; - } - } - - // 绑定事件 - bindEvents() { - const loadBtn = document.getElementById('loadBtn'); - const rankIdInput = document.getElementById('rankId'); - const retryBtn = document.getElementById('retryBtn'); - - loadBtn.addEventListener('click', () => this.loadRankDetail()); - retryBtn.addEventListener('click', () => this.loadRankDetail()); - - // 回车键加载 - rankIdInput.addEventListener('keypress', (e) => { - if (e.key === 'Enter') { - this.loadRankDetail(); - } - }); - - // 输入验证 - rankIdInput.addEventListener('input', (e) => { - const value = e.target.value.trim(); - loadBtn.disabled = !value || !/^\d+$/.test(value); - }); - } - - // 检查URL参数 - checkUrlParams() { - const urlParams = new URLSearchParams(window.location.search); - const rankId = urlParams.get('id'); - const rankName = urlParams.get('name'); - - if (rankId && /^\d+$/.test(rankId)) { - document.getElementById('rankId').value = rankId; - - // 如果有榜单名称,更新页面标题 - if (rankName) { - document.title = `${decodeURIComponent(rankName)} - 网易云榜单详情`; - document.querySelector('.title').textContent = `🎵 ${decodeURIComponent(rankName)}`; - document.querySelector('.subtitle').textContent = '正在加载榜单详情...'; - } - - this.loadRankDetail(); - } - } - - // 加载榜单详情 - async loadRankDetail() { - const rankId = document.getElementById('rankId').value.trim(); - - if (!rankId) { - this.showError('请输入榜单ID'); - return; - } - - if (!/^\d+$/.test(rankId)) { - this.showError('榜单ID必须是数字'); - return; - } - - this.showLoading(); - this.currentApiIndex = 0; - - try { - const data = await this.fetchRankDetail(rankId); - this.displayRankDetail(data); - this.hideLoading(); - - // 更新URL - const newUrl = new URL(window.location); - newUrl.searchParams.set('id', rankId); - window.history.replaceState({}, '', newUrl); - - } catch (error) { - console.error('加载榜单详情失败:', error); - this.hideLoading(); - this.showError(error.message || '加载失败,请检查榜单ID是否正确'); - } - } - - // 获取榜单详情数据 - async fetchRankDetail(rankId) { - let lastError = null; - - for (let i = 0; i < this.apiUrls.length; i++) { - try { - const apiUrl = this.apiUrls[this.currentApiIndex]; - const url = `${apiUrl}/v2/ncm-rank/${rankId}`; - - console.log(`尝试API ${this.currentApiIndex + 1}:`, url); - - const controller = new AbortController(); - const timeoutId = setTimeout(() => controller.abort(), 10000); - - const response = await fetch(url, { - signal: controller.signal, - headers: { - 'Accept': 'application/json', - } - }); - - clearTimeout(timeoutId); - - if (!response.ok) { - throw new Error(`HTTP ${response.status}: ${response.statusText}`); - } - - const data = await response.json(); - - if (data.code !== 200) { - throw new Error(data.message || '获取数据失败'); - } - - console.log('API调用成功:', data); - return data; - - } catch (error) { - console.warn(`API ${this.currentApiIndex + 1} 失败:`, error.message); - lastError = error; - this.currentApiIndex = (this.currentApiIndex + 1) % this.apiUrls.length; - - if (error.name === 'AbortError') { - lastError = new Error('请求超时,请重试'); - } - } - } - - throw lastError || new Error('所有API接口都无法访问'); - } - - // 显示榜单详情 - displayRankDetail(data) { - this.rankData = data; - const songs = data.data || []; - - // 显示榜单信息(如果有的话) - this.displayRankInfo(songs[0]); - - // 显示歌曲列表 - this.displaySongList(songs); - - // 显示相关区域 - document.getElementById('songList').style.display = 'block'; - document.getElementById('error').style.display = 'none'; - } - - // 显示榜单信息 - displayRankInfo(firstSong) { - const rankInfo = document.getElementById('rankInfo'); - - if (firstSong && firstSong.rank_name) { - document.getElementById('rankName').textContent = firstSong.rank_name; - document.getElementById('rankDescription').textContent = `${firstSong.rank_name} - 网易云音乐官方榜单`; - - // 如果有专辑封面,使用第一首歌的专辑封面作为榜单封面 - if (firstSong.album && firstSong.album.cover) { - document.getElementById('rankCover').src = firstSong.album.cover; - document.getElementById('rankCover').alt = firstSong.rank_name; - } - - document.getElementById('updateTime').textContent = `更新时间: ${this.formatDate(new Date())}`; - document.getElementById('updateFrequency').textContent = '实时更新'; - - rankInfo.style.display = 'block'; - } else { - rankInfo.style.display = 'none'; - } - } - - // 显示歌曲列表 - displaySongList(songs) { - const songsContainer = document.getElementById('songs'); - const songCount = document.getElementById('songCount'); - - songCount.textContent = `共 ${songs.length} 首歌曲`; - - songsContainer.innerHTML = ''; - - songs.forEach((song, index) => { - const songElement = this.createSongElement(song, index); - songsContainer.appendChild(songElement); - }); - } - - // 创建歌曲元素 - createSongElement(song) { - const songDiv = document.createElement('div'); - songDiv.className = 'song-item'; - - // 处理艺术家信息 - const artists = Array.isArray(song.artist) ? song.artist : [song.artist].filter(Boolean); - const artistNames = artists.map(artist => - typeof artist === 'object' ? artist.name : artist - ).join(', ') || '未知艺术家'; - - // 处理专辑信息 - const albumName = song.album && song.album.name ? song.album.name : '未知专辑'; - - // 处理时长 - const duration = song.duration_desc || this.formatDuration(song.duration); - - // 处理热度 - const popularity = song.popularity || song.score || 0; - - songDiv.innerHTML = ` -
    ${song.rank}
    -
    -
    ${this.escapeHtml(song.title)}
    -
    ${this.escapeHtml(artistNames)}
    -
    ${this.escapeHtml(albumName)}
    -
    -
    -
    ${duration}
    -
    ${popularity}%
    -
    - `; - - // 添加点击事件 - if (song.link) { - songDiv.style.cursor = 'pointer'; - songDiv.addEventListener('click', () => { - window.open(song.link, '_blank'); - }); - } - - return songDiv; - } - - // 格式化时长 - formatDuration(duration) { - if (!duration) return '--:--'; - - const seconds = Math.floor(duration / 1000); - const minutes = Math.floor(seconds / 60); - const remainingSeconds = seconds % 60; - - return `${minutes}:${remainingSeconds.toString().padStart(2, '0')}`; - } - - // 格式化日期 - formatDate(date) { - return date.toLocaleString('zh-CN', { - year: 'numeric', - month: '2-digit', - day: '2-digit', - hour: '2-digit', - minute: '2-digit' - }); - } - - // HTML转义 - escapeHtml(text) { - const div = document.createElement('div'); - div.textContent = text; - return div.innerHTML; - } - - // 显示加载状态 - showLoading() { - document.getElementById('loading').style.display = 'block'; - document.getElementById('error').style.display = 'none'; - document.getElementById('songList').style.display = 'none'; - document.getElementById('loadBtn').disabled = true; - } - - // 隐藏加载状态 - hideLoading() { - document.getElementById('loading').style.display = 'none'; - document.getElementById('loadBtn').disabled = false; - } - - // 显示错误信息 - showError(message) { - document.getElementById('error').style.display = 'block'; - document.getElementById('errorMessage').textContent = message; - document.getElementById('loading').style.display = 'none'; - document.getElementById('songList').style.display = 'none'; - document.getElementById('loadBtn').disabled = false; - } -} - -// 全局错误处理 -window.addEventListener('error', (event) => { - console.error('全局错误:', event.error); -}); - -window.addEventListener('unhandledrejection', (event) => { - console.error('未处理的Promise拒绝:', event.reason); -}); - -// 页面加载完成后初始化 -document.addEventListener('DOMContentLoaded', () => { - new NeteaseMusicRankDetail(); -}); - -// 添加CSS动画类 -document.addEventListener('DOMContentLoaded', () => { - // 为页面元素添加淡入动画 - const elements = document.querySelectorAll('.container > *'); - elements.forEach((el, index) => { - el.style.opacity = '0'; - el.style.transform = 'translateY(20px)'; - el.style.transition = 'opacity 0.6s ease, transform 0.6s ease'; - - setTimeout(() => { - el.style.opacity = '1'; - el.style.transform = 'translateY(0)'; - }, index * 100); - }); -}); \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/热搜榜单/网易云榜单详情/接口集合.json b/frontend/react-app/public/60sapi/热搜榜单/网易云榜单详情/接口集合.json deleted file mode 100644 index 04e92b7f..00000000 --- a/frontend/react-app/public/60sapi/热搜榜单/网易云榜单详情/接口集合.json +++ /dev/null @@ -1,7 +0,0 @@ -[ - "https://60s-cf.viki.moe", - "https://60s.viki.moe", - "https://60s.b23.run", - "https://60s.114128.xyz", - "https://60s-cf.114128.xyz" -] diff --git a/frontend/react-app/public/60sapi/热搜榜单/网易云榜单详情/返回接口.json b/frontend/react-app/public/60sapi/热搜榜单/网易云榜单详情/返回接口.json deleted file mode 100644 index c5ed47a3..00000000 --- a/frontend/react-app/public/60sapi/热搜榜单/网易云榜单详情/返回接口.json +++ /dev/null @@ -1,5612 +0,0 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": [ - { - "id": 2040015902, - "rank": 1, - "rank_name": "飙升榜", - "title": "熄灭", - "artist": [ - { - "id": 12324449, - "name": "TC", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=12324449" - } - ], - "album": { - "id": 163848123, - "name": "熄灭", - "cover": "http://p1.music.126.net/sNOy5UAdfk_OYumV4qF-0g==/109951168551205771.jpg", - "published": "2023-07-15", - "published_at": 1689436800000, - "company": "" - }, - "duration": 148611, - "duration_desc": "2:28", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 29724874, - "size_desc": "29.72 MB", - "bitrate": 1600134, - "extension": "flac" - }, - "hq": { - "size": 5947603, - "size_desc": "5.95 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 3568579, - "size_desc": "3.57 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 2379067, - "size_desc": "2.38 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2040015902" - }, - { - "id": 2733008419, - "rank": 2, - "rank_name": "飙升榜", - "title": "LOVE", - "artist": [ - { - "id": 12356808, - "name": "范世錡", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=12356808" - } - ], - "album": { - "id": 280422980, - "name": "LOVE,So...", - "cover": "http://p1.music.126.net/BHdtr1R0-yuXLdoY3kJGUg==/109951171697418256.jpg", - "published": "2025-08-04", - "published_at": 1754323200000, - "company": "天娱传媒" - }, - "duration": 238523, - "duration_desc": "3:58", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 30885411, - "size_desc": "30.89 MB", - "bitrate": 1035740, - "extension": "flac" - }, - "hq": { - "size": 9543405, - "size_desc": "9.54 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 5726061, - "size_desc": "5.73 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 3817389, - "size_desc": "3.82 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2733008419" - }, - { - "id": 2735554018, - "rank": 3, - "rank_name": "飙升榜", - "title": "拍拍灰", - "artist": [ - { - "id": 30000014, - "name": "脏饼干", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=30000014" - } - ], - "album": { - "id": 281295264, - "name": "拍拍灰", - "cover": "http://p1.music.126.net/4riboo3M7VuJj6We6Sc1xw==/109951171845374025.jpg", - "published": "2025-08-14", - "published_at": 1755187200000, - "company": "" - }, - "duration": 184106, - "duration_desc": "3:04", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 21134984, - "size_desc": "21.13 MB", - "bitrate": 918233, - "extension": "flac" - }, - "hq": { - "size": 7367085, - "size_desc": "7.37 MB", - "bitrate": 320002, - "extension": "mp3" - }, - "mq": { - "size": 4420269, - "size_desc": "4.42 MB", - "bitrate": 192002, - "extension": "mp3" - }, - "lq": { - "size": 2946861, - "size_desc": "2.95 MB", - "bitrate": 128002, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2735554018" - }, - { - "id": 2684422547, - "rank": 4, - "rank_name": "飙升榜", - "title": "Money Loves Me", - "artist": [ - { - "id": 97594003, - "name": "Alchemist Harmony", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=97594003" - } - ], - "album": { - "id": 265812259, - "name": "Money Loves Me", - "cover": "http://p1.music.126.net/nKyjr2f050Dl7CD4NUyKCQ==/109951170609858632.jpg", - "published": "2025-03-09", - "published_at": 1741536000000, - "company": "Alchemist Harmony" - }, - "duration": 174000, - "duration_desc": "2:54", - "popularity": 100, - "score": 100, - "fee": 1, - "status": 0, - "mb": { - "sq": { - "size": 34717430, - "size_desc": "34.72 MB", - "bitrate": 1596056, - "extension": "flac" - }, - "hq": { - "size": 6962199, - "size_desc": "6.96 MB", - "bitrate": 320002, - "extension": "mp3" - }, - "mq": { - "size": 4177337, - "size_desc": "4.18 MB", - "bitrate": 192002, - "extension": "mp3" - }, - "lq": { - "size": 2784906, - "size_desc": "2.78 MB", - "bitrate": 128002, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2684422547" - }, - { - "id": 2677396501, - "rank": 5, - "rank_name": "飙升榜", - "title": "NOT GOOD", - "artist": [ - { - "id": 12563131, - "name": "Rapeter", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=12563131" - } - ], - "album": { - "id": 263242113, - "name": "IMGOOD别担心我", - "cover": "http://p1.music.126.net/QpNRZsfMP5J4tOlziA8Pnw==/109951170504642760.jpg", - "published": "2025-02-21", - "published_at": 1740153600000, - "company": "" - }, - "duration": 190558, - "duration_desc": "3:10", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 24001098, - "size_desc": "24 MB", - "bitrate": 1007462, - "extension": "flac" - }, - "hq": { - "size": 7624365, - "size_desc": "7.62 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 4574637, - "size_desc": "4.57 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 3049773, - "size_desc": "3.05 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2677396501" - }, - { - "id": 405253632, - "rank": 6, - "rank_name": "飙升榜", - "title": "梦回还 (TV size)", - "artist": [ - { - "id": 1215003, - "name": "呦猫UNEKO", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=1215003" - } - ], - "album": { - "id": 34513527, - "name": "梦回还", - "cover": "http://p1.music.126.net/hAfIXJP_ZBRQKd1VE_Hqbg==/16625715324173485.jpg", - "published": "2016-03-05", - "published_at": 1457142849504, - "company": "" - }, - "duration": 72456, - "duration_desc": "1:12", - "popularity": 100, - "score": 100, - "fee": 0, - "status": 0, - "mb": { - "sq": null, - "hq": { - "size": 2902769, - "size_desc": "2.9 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 1741679, - "size_desc": "1.74 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 1161133, - "size_desc": "1.16 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=405253632" - }, - { - "id": 1975295694, - "rank": 7, - "rank_name": "飙升榜", - "title": "小哑巴", - "artist": [ - { - "id": 48277407, - "name": "BOBBYNOPEACE", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=48277407" - } - ], - "album": { - "id": 150299202, - "name": "小哑巴", - "cover": "http://p1.music.126.net/IhsEqn9OXuBYt2_Y8pAgCQ==/109951167815351812.jpg", - "published": "2022-08-27", - "published_at": 1661616000000, - "company": "" - }, - "duration": 171176, - "duration_desc": "2:51", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 17473483, - "size_desc": "17.47 MB", - "bitrate": 816630, - "extension": "flac" - }, - "hq": { - "size": 6849645, - "size_desc": "6.85 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 4109805, - "size_desc": "4.11 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 2739885, - "size_desc": "2.74 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=1975295694" - }, - { - "id": 88926, - "rank": 8, - "rank_name": "飙升榜", - "title": "想你的夜", - "artist": [ - { - "id": 2868, - "name": "关喆", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=2868" - } - ], - "album": { - "id": 8668, - "name": "永远的永远", - "cover": "http://p1.music.126.net/zu9MjBERozqTv_0NpM91Rg==/109951164094037727.jpg", - "published": "2009-07-05", - "published_at": 1246809600000, - "company": "爱贝克思" - }, - "duration": 265960, - "duration_desc": "4:25", - "popularity": 100, - "score": 100, - "fee": 1, - "status": 0, - "mb": { - "sq": { - "size": 26941966, - "size_desc": "26.94 MB", - "bitrate": 1411000, - "extension": "flac" - }, - "hq": { - "size": 10641285, - "size_desc": "10.64 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 6384788, - "size_desc": "6.38 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 4256540, - "size_desc": "4.26 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=88926" - }, - { - "id": 2118740086, - "rank": 9, - "rank_name": "飙升榜", - "title": "黒のバースデイ", - "artist": [ - { - "id": 56525844, - "name": "Ave Mujica", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=56525844" - } - ], - "album": { - "id": 183578899, - "name": "黒のバースデイ", - "cover": "http://p1.music.126.net/0QwEBXfAZ8RzE41vZPlu7A==/109951170223390839.jpg", - "published": "2023-04-10", - "published_at": 1681142400000, - "company": "ブシロードミュージック" - }, - "duration": 225706, - "duration_desc": "3:45", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 31389013, - "size_desc": "31.39 MB", - "bitrate": 1112559, - "extension": "flac" - }, - "hq": { - "size": 9030765, - "size_desc": "9.03 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 5418477, - "size_desc": "5.42 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 3612333, - "size_desc": "3.61 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2118740086" - }, - { - "id": 2729810172, - "rank": 10, - "rank_name": "飙升榜", - "title": "Montagem Nada Tropic", - "artist": [ - { - "id": 99376836, - "name": "MHM", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=99376836" - } - ], - "album": { - "id": 279515736, - "name": "Montagem Nada Tropic", - "cover": "http://p1.music.126.net/YTA1HZJcLit_QoFfG81puQ==/109951171520378357.jpg", - "published": "2025-07-26", - "published_at": 1753545600000, - "company": "" - }, - "duration": 121997, - "duration_desc": "2:01", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 12718907, - "size_desc": "12.72 MB", - "bitrate": 833893, - "extension": "flac" - }, - "hq": { - "size": 4882852, - "size_desc": "4.88 MB", - "bitrate": 320003, - "extension": "mp3" - }, - "mq": { - "size": 2929729, - "size_desc": "2.93 MB", - "bitrate": 192003, - "extension": "mp3" - }, - "lq": { - "size": 1953167, - "size_desc": "1.95 MB", - "bitrate": 128003, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2729810172" - }, - { - "id": 2734387620, - "rank": 11, - "rank_name": "飙升榜", - "title": "No title -10 Years Later Edition-", - "artist": [ - { - "id": 13059968, - "name": "Reol", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=13059968" - } - ], - "album": { - "id": 280924754, - "name": "“No title” in NIPPON BUDOKAN", - "cover": "http://p1.music.126.net/1OmrYxGKdMGXH_lql-N3iA==/109951171817417918.jpg", - "published": "2025-08-16", - "published_at": 1755360000000, - "company": "索尼音乐" - }, - "duration": 265264, - "duration_desc": "4:25", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 58682245, - "size_desc": "58.68 MB", - "bitrate": 1769624, - "extension": "flac" - }, - "hq": { - "size": 10613072, - "size_desc": "10.61 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 6367861, - "size_desc": "6.37 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 4245255, - "size_desc": "4.25 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2734387620" - }, - { - "id": 2738501239, - "rank": 12, - "rank_name": "飙升榜", - "title": "七小夕", - "artist": [ - { - "id": 53868079, - "name": "Vvy王泽宇", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=53868079" - } - ], - "album": { - "id": 282255005, - "name": "七小夕", - "cover": "http://p1.music.126.net/EcEdbDFwZS41UcleVx5rAA==/109951171907096312.jpg", - "published": "2025-08-20", - "published_at": 1755705600000, - "company": "" - }, - "duration": 234461, - "duration_desc": "3:54", - "popularity": 100, - "score": 100, - "fee": 0, - "status": 0, - "mb": { - "sq": { - "size": 25150986, - "size_desc": "25.15 MB", - "bitrate": 858023, - "extension": "flac" - }, - "hq": { - "size": 9381138, - "size_desc": "9.38 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 5628700, - "size_desc": "5.63 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 3752481, - "size_desc": "3.75 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2738501239" - }, - { - "id": 2622939350, - "rank": 13, - "rank_name": "飙升榜", - "title": "莆田才子", - "artist": [ - { - "id": 35884195, - "name": "翁杰Winjay", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=35884195" - } - ], - "album": { - "id": 247120411, - "name": "莆田才子", - "cover": "http://p1.music.126.net/quYbskDqRirX3-wqgRLk7A==/109951169934912352.jpg", - "published": "2024-09-06", - "published_at": 1725638400000, - "company": "" - }, - "duration": 150205, - "duration_desc": "2:30", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 17815377, - "size_desc": "17.82 MB", - "bitrate": 948852, - "extension": "flac" - }, - "hq": { - "size": 6010605, - "size_desc": "6.01 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 3606381, - "size_desc": "3.61 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 2404269, - "size_desc": "2.4 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2622939350" - }, - { - "id": 2737575141, - "rank": 14, - "rank_name": "飙升榜", - "title": "陪你度过漫长岁月", - "artist": [ - { - "id": 58810912, - "name": "赵小童", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=58810912" - } - ], - "album": { - "id": 282015216, - "name": "漫漫协奏曲", - "cover": "http://p1.music.126.net/a0yqXomXz_85AzybTmxBCA==/109951171910165132.jpg", - "published": "2025-08-21", - "published_at": 1755792000000, - "company": "网易·云上" - }, - "duration": 307472, - "duration_desc": "5:07", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 32893926, - "size_desc": "32.89 MB", - "bitrate": 855708, - "extension": "flac" - }, - "hq": { - "size": 12301485, - "size_desc": "12.3 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 7380909, - "size_desc": "7.38 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 4920621, - "size_desc": "4.92 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2737575141" - }, - { - "id": 2739871903, - "rank": 15, - "rank_name": "飙升榜", - "title": "路", - "artist": [ - { - "id": 62183661, - "name": "DOMMIU李由音", - "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=62183661" - } - ], - "album": { - "id": 282846013, - "name": "路", - "cover": "http://p2.music.126.net/RWMmqPsIpY96teLLGPVKqg==/109951171928997751.jpg", - "published": "2025-08-25", - "published_at": 1756137600000, - "company": "索尼音乐X 深声不息" - }, - "duration": 222890, - "duration_desc": "3:42", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 27957021, - "size_desc": "27.96 MB", - "bitrate": 1003287, - "extension": "flac" - }, - "hq": { - "size": 8918445, - "size_desc": "8.92 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 5351085, - "size_desc": "5.35 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 3567405, - "size_desc": "3.57 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2739871903" - }, - { - "id": 2161222939, - "rank": 16, - "rank_name": "飙升榜", - "title": "沦陷", - "artist": [ - { - "id": 13005262, - "name": "JuggShots", - "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=13005262" - } - ], - "album": { - "id": 197781559, - "name": "沦陷", - "cover": "http://p2.music.126.net/ctib5R--oR68W2IrOk765w==/109951169635716223.jpg", - "published": "2024-05-28", - "published_at": 1716912000000, - "company": "" - }, - "duration": 183770, - "duration_desc": "3:03", - "popularity": 100, - "score": 100, - "fee": 1, - "status": 0, - "mb": { - "sq": { - "size": 22189011, - "size_desc": "22.19 MB", - "bitrate": 965943, - "extension": "flac" - }, - "hq": { - "size": 7353645, - "size_desc": "7.35 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 4412205, - "size_desc": "4.41 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 2941485, - "size_desc": "2.94 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2161222939" - }, - { - "id": 26093064, - "rank": 17, - "rank_name": "飙升榜", - "title": "Sacred Play Secret Place", - "artist": [ - { - "id": 12283, - "name": "Matryoshka", - "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=12283" - } - ], - "album": { - "id": 2386118, - "name": "Laideronnette", - "cover": "http://p2.music.126.net/1opYZaMgfAQrKMKfLy1xZA==/109951169789816801.jpg", - "published": "2012-12-11", - "published_at": 1355241600000, - "company": "Virgin Babylon Records" - }, - "duration": 317547, - "duration_desc": "5:17", - "popularity": 100, - "score": 100, - "fee": 1, - "status": 0, - "mb": { - "sq": { - "size": 30171985, - "size_desc": "30.17 MB", - "bitrate": 760124, - "extension": "flac" - }, - "hq": { - "size": 12704958, - "size_desc": "12.7 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 7622992, - "size_desc": "7.62 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 5082009, - "size_desc": "5.08 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=26093064" - }, - { - "id": 2081549596, - "rank": 18, - "rank_name": "飙升榜", - "title": "下次见", - "artist": [ - { - "id": 55305505, - "name": "林心念", - "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=55305505" - } - ], - "album": { - "id": 174605542, - "name": "下次见", - "cover": "http://p2.music.126.net/g6STNqcm32HjAm4CpoJcBg==/109951168910388635.jpg", - "published": "2023-09-15", - "published_at": 1694793600000, - "company": "讯飞音乐" - }, - "duration": 159375, - "duration_desc": "2:39", - "popularity": 100, - "score": 100, - "fee": 1, - "status": 0, - "mb": { - "sq": { - "size": 17672725, - "size_desc": "17.67 MB", - "bitrate": 887101, - "extension": "flac" - }, - "hq": { - "size": 6377325, - "size_desc": "6.38 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 3826413, - "size_desc": "3.83 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 2550957, - "size_desc": "2.55 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2081549596" - }, - { - "id": 1894316939, - "rank": 19, - "rank_name": "飙升榜", - "title": "最渣男主角", - "artist": [ - { - "id": 12292664, - "name": "Shooter", - "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=12292664" - }, - { - "id": 30003804, - "name": "404 RAPPER", - "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=30003804" - } - ], - "album": { - "id": 136039945, - "name": "最渣男主角", - "cover": "http://p2.music.126.net/9UTbTz8efieRMQvnaoJRwQ==/109951166612306430.jpg", - "published": "2021-11-11", - "published_at": 1636646400000, - "company": "" - }, - "duration": 203664, - "duration_desc": "3:23", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 20614401, - "size_desc": "20.61 MB", - "bitrate": 809738, - "extension": "flac" - }, - "hq": { - "size": 8149485, - "size_desc": "8.15 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 4889709, - "size_desc": "4.89 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 3259821, - "size_desc": "3.26 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=1894316939" - }, - { - "id": 2740938171, - "rank": 20, - "rank_name": "飙升榜", - "title": "须臾Karios(栩渝同人曲)", - "artist": [ - { - "id": 33696439, - "name": "周冠宏", - "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=33696439" - }, - { - "id": 34270051, - "name": "赵春寒Z&Hanl", - "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=34270051" - } - ], - "album": { - "id": 283152840, - "name": "须臾Karios(栩渝同人曲)", - "cover": "http://p2.music.126.net/s28QYI-yCjr2kHRGVsrr2g==/109951171943770807.jpg", - "published": "2025-08-27", - "published_at": 1756310400000, - "company": "" - }, - "duration": 246342, - "duration_desc": "4:06", - "popularity": 100, - "score": 100, - "fee": 0, - "status": 0, - "mb": { - "sq": { - "size": 32856508, - "size_desc": "32.86 MB", - "bitrate": 1066872, - "extension": "flac" - }, - "hq": { - "size": 9856365, - "size_desc": "9.86 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 5913837, - "size_desc": "5.91 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 3942573, - "size_desc": "3.94 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2740938171" - }, - { - "id": 2738228860, - "rank": 21, - "rank_name": "飙升榜", - "title": "Dehors (普通话版)", - "artist": [ - { - "id": 338718, - "name": "JORDANN", - "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=338718" - } - ], - "album": { - "id": 282257834, - "name": "Dehors (普通话版)", - "cover": "http://p2.music.126.net/8mNbLer5tKnkgj3Q4JPpWw==/109951171903070287.jpg", - "published": "2025-08-21", - "published_at": 1755792000000, - "company": "JORDANN" - }, - "duration": 198026, - "duration_desc": "3:18", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 20334981, - "size_desc": "20.33 MB", - "bitrate": 821356, - "extension": "flac" - }, - "hq": { - "size": 7923885, - "size_desc": "7.92 MB", - "bitrate": 320002, - "extension": "mp3" - }, - "mq": { - "size": 4754349, - "size_desc": "4.75 MB", - "bitrate": 192002, - "extension": "mp3" - }, - "lq": { - "size": 3169581, - "size_desc": "3.17 MB", - "bitrate": 128002, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2738228860" - }, - { - "id": 2710416778, - "rank": 22, - "rank_name": "飙升榜", - "title": "Long term", - "artist": [ - { - "id": 94359653, - "name": "AI MUSIC MATRIX", - "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=94359653" - } - ], - "album": { - "id": 273690835, - "name": "Relax R&B 76", - "cover": "http://p2.music.126.net/p8hySF3PjpGyEdExUAocCw==/109951171182041062.jpg", - "published": "2025-05-30", - "published_at": 1748620800000, - "company": "Sound Matrix" - }, - "duration": 189960, - "duration_desc": "3:09", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 14200860, - "size_desc": "14.2 MB", - "bitrate": 597909, - "extension": "flac" - }, - "hq": { - "size": 7600631, - "size_desc": "7.6 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 4560396, - "size_desc": "4.56 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 3040279, - "size_desc": "3.04 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2710416778" - }, - { - "id": 2038203229, - "rank": 23, - "rank_name": "飙升榜", - "title": "FRIDAY9 II", - "artist": [ - { - "id": 28642672, - "name": "kkluv", - "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=28642672" - } - ], - "album": { - "id": 163444153, - "name": "FRIDAY9 II", - "cover": "http://p2.music.126.net/TAz4QuITFBhN4D1xsiq0kg==/109951168538063565.jpg", - "published": "2023-01-17", - "published_at": 1673971200000, - "company": "索尼音乐" - }, - "duration": 166285, - "duration_desc": "2:46", - "popularity": 100, - "score": 100, - "fee": 1, - "status": 0, - "mb": { - "sq": { - "size": 32263929, - "size_desc": "32.26 MB", - "bitrate": 1552216, - "extension": "flac" - }, - "hq": { - "size": 6653954, - "size_desc": "6.65 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 3992390, - "size_desc": "3.99 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 2661608, - "size_desc": "2.66 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2038203229" - }, - { - "id": 2740641241, - "rank": 24, - "rank_name": "飙升榜", - "title": "归舟", - "artist": [ - { - "id": 9491, - "name": "谭晶", - "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=9491" - }, - { - "id": 53926051, - "name": "燕云十六声", - "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=53926051" - } - ], - "album": { - "id": 283122508, - "name": "归舟", - "cover": "http://p2.music.126.net/gWQj5VbaDK8kUvJS3uOl2g==/109951171939389473.jpg", - "published": "2025-08-27", - "published_at": 1756310400000, - "company": "" - }, - "duration": 301006, - "duration_desc": "5:01", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 35503109, - "size_desc": "35.5 MB", - "bitrate": 943436, - "extension": "flac" - }, - "hq": { - "size": 12042285, - "size_desc": "12.04 MB", - "bitrate": 320001, - "extension": "mp3" - }, - "mq": { - "size": 7225389, - "size_desc": "7.23 MB", - "bitrate": 192001, - "extension": "mp3" - }, - "lq": { - "size": 4816941, - "size_desc": "4.82 MB", - "bitrate": 128001, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2740641241" - }, - { - "id": 2604224368, - "rank": 25, - "rank_name": "飙升榜", - "title": "São Paulo", - "artist": [ - { - "id": 30384202, - "name": "Fyex", - "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=30384202" - } - ], - "album": { - "id": 240979251, - "name": "São Paulo", - "cover": "http://p2.music.126.net/aGGl_ANW0kVZzfJMtmLR9Q==/109951169743205693.jpg", - "published": "2024-06-06", - "published_at": 1717689600000, - "company": "Fyex" - }, - "duration": 97850, - "duration_desc": "1:37", - "popularity": 100, - "score": 100, - "fee": 1, - "status": 0, - "mb": { - "sq": { - "size": 9831272, - "size_desc": "9.83 MB", - "bitrate": 803775, - "extension": "flac" - }, - "hq": { - "size": 3916321, - "size_desc": "3.92 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 2349810, - "size_desc": "2.35 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 1566555, - "size_desc": "1.57 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2604224368" - }, - { - "id": 2738715964, - "rank": 26, - "rank_name": "飙升榜", - "title": "染春", - "artist": [ - { - "id": 27730224, - "name": "回春丹", - "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=27730224" - } - ], - "album": { - "id": 282452357, - "name": "大把时间璀璨", - "cover": "http://p2.music.126.net/_gJgbfqTgWH2T1vk1Br1ig==/109951171911478103.jpg", - "published": "2025-08-25", - "published_at": 1756137600000, - "company": "池沼版全" - }, - "duration": 206094, - "duration_desc": "3:26", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 23766803, - "size_desc": "23.77 MB", - "bitrate": 922409, - "extension": "flac" - }, - "hq": { - "size": 8246445, - "size_desc": "8.25 MB", - "bitrate": 320002, - "extension": "mp3" - }, - "mq": { - "size": 4947885, - "size_desc": "4.95 MB", - "bitrate": 192002, - "extension": "mp3" - }, - "lq": { - "size": 3298605, - "size_desc": "3.3 MB", - "bitrate": 128002, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2738715964" - }, - { - "id": 2716412355, - "rank": 27, - "rank_name": "飙升榜", - "title": "Supra", - "artist": [ - { - "id": 52410166, - "name": "泰格西", - "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=52410166" - }, - { - "id": 32438941, - "name": "cLoner23", - "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=32438941" - } - ], - "album": { - "id": 275450408, - "name": "Block Core", - "cover": "http://p2.music.126.net/w6MAd3zX38cPTkB9v9aMZg==/109951171319396818.jpg", - "published": "2025-06-17", - "published_at": 1750176000000, - "company": "" - }, - "duration": 126666, - "duration_desc": "2:06", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 15475009, - "size_desc": "15.48 MB", - "bitrate": 977219, - "extension": "flac" - }, - "hq": { - "size": 5068845, - "size_desc": "5.07 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 3041325, - "size_desc": "3.04 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 2027565, - "size_desc": "2.03 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2716412355" - }, - { - "id": 109196, - "rank": 28, - "rank_name": "飙升榜", - "title": "想太多", - "artist": [ - { - "id": 3689, - "name": "李玖哲", - "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=3689" - } - ], - "album": { - "id": 10826, - "name": "想太多", - "cover": "http://p2.music.126.net/rseQHt6MVwmyLMpY_f5bOQ==/131941395346293.jpg", - "published": "2007-10-11", - "published_at": 1192118400000, - "company": "华纳音乐" - }, - "duration": 216613, - "duration_desc": "3:36", - "popularity": 100, - "score": 100, - "fee": 0, - "status": 0, - "mb": { - "sq": { - "size": 23196782, - "size_desc": "23.2 MB", - "bitrate": 856705, - "extension": "flac" - }, - "hq": { - "size": 8667472, - "size_desc": "8.67 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 5200501, - "size_desc": "5.2 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 3467015, - "size_desc": "3.47 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=109196" - }, - { - "id": 167942, - "rank": 29, - "rank_name": "飙升榜", - "title": "王妃", - "artist": [ - { - "id": 5768, - "name": "萧敬腾", - "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=5768" - } - ], - "album": { - "id": 16961, - "name": "王妃", - "cover": "http://p2.music.126.net/Ewy0QAwwv6gXxszRn1KNpQ==/109951168271412207.jpg", - "published": "2009-07-16", - "published_at": 1247760000000, - "company": "华纳音乐" - }, - "duration": 221760, - "duration_desc": "3:41", - "popularity": 100, - "score": 100, - "fee": 1, - "status": 0, - "mb": { - "sq": { - "size": 29095408, - "size_desc": "29.1 MB", - "bitrate": 1049617, - "extension": "flac" - }, - "hq": { - "size": 8873317, - "size_desc": "8.87 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 5324008, - "size_desc": "5.32 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 3549353, - "size_desc": "3.55 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=167942" - }, - { - "id": 2738583947, - "rank": 30, - "rank_name": "飙升榜", - "title": "Happy Hare", - "artist": [ - { - "id": 97654074, - "name": "X Chamber", - "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=97654074" - } - ], - "album": { - "id": 282405671, - "name": "Happy Hare", - "cover": "http://p2.music.126.net/ctQm9kmi8CjooxADvLyMQA==/109951171908403517.jpg", - "published": "2025-08-20", - "published_at": 1755705600000, - "company": "" - }, - "duration": 96190, - "duration_desc": "1:36", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 20048170, - "size_desc": "20.05 MB", - "bitrate": 1667227, - "extension": "flac" - }, - "hq": { - "size": 3850493, - "size_desc": "3.85 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 2310313, - "size_desc": "2.31 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 1540223, - "size_desc": "1.54 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2738583947" - }, - { - "id": 2735962127, - "rank": 31, - "rank_name": "飙升榜", - "title": "放大", - "artist": [ - { - "id": 49844742, - "name": "徐子未", - "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=49844742" - } - ], - "album": { - "id": 281446148, - "name": "放大", - "cover": "http://p2.music.126.net/WBbtAlKQBRgItkpbzUXa1w==/109951171856097610.jpg", - "published": "2025-08-15", - "published_at": 1755273600000, - "company": "索尼音乐" - }, - "duration": 205200, - "duration_desc": "3:25", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 23835315, - "size_desc": "23.84 MB", - "bitrate": 929104, - "extension": "flac" - }, - "hq": { - "size": 8209965, - "size_desc": "8.21 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 4925997, - "size_desc": "4.93 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 3284013, - "size_desc": "3.28 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2735962127" - }, - { - "id": 2738719308, - "rank": 32, - "rank_name": "飙升榜", - "title": "骑士", - "artist": [ - { - "id": 27730224, - "name": "回春丹", - "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=27730224" - } - ], - "album": { - "id": 282452357, - "name": "大把时间璀璨", - "cover": "http://p2.music.126.net/_gJgbfqTgWH2T1vk1Br1ig==/109951171911478103.jpg", - "published": "2025-08-25", - "published_at": 1756137600000, - "company": "池沼版全" - }, - "duration": 205376, - "duration_desc": "3:25", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 24969418, - "size_desc": "24.97 MB", - "bitrate": 972482, - "extension": "flac" - }, - "hq": { - "size": 8217645, - "size_desc": "8.22 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 4930605, - "size_desc": "4.93 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 3287085, - "size_desc": "3.29 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2738719308" - }, - { - "id": 2162160807, - "rank": 33, - "rank_name": "飙升榜", - "title": "NEXT!", - "artist": [ - { - "id": 54842340, - "name": "NCTS", - "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=54842340" - } - ], - "album": { - "id": 198075556, - "name": "NEXT!", - "cover": "http://p2.music.126.net/W4C4eI4EAE4dXwtZAeZv8Q==/109951169644186817.jpg", - "published": "2024-06-06", - "published_at": 1717689600000, - "company": "broke" - }, - "duration": 99692, - "duration_desc": "1:39", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 12133996, - "size_desc": "12.13 MB", - "bitrate": 973715, - "extension": "flac" - }, - "hq": { - "size": 3990509, - "size_desc": "3.99 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 2394323, - "size_desc": "2.39 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 1596230, - "size_desc": "1.6 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2162160807" - }, - { - "id": 2099778087, - "rank": 34, - "rank_name": "飙升榜", - "title": "发迹", - "artist": [ - { - "id": 49141872, - "name": "Top Barry", - "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=49141872" - } - ], - "album": { - "id": 179034955, - "name": "发迹", - "cover": "http://p2.music.126.net/WKf8wp_58LjK2I2EA1gKjQ==/109951169055625483.jpg", - "published": "2023-11-14", - "published_at": 1699977600000, - "company": "" - }, - "duration": 162304, - "duration_desc": "2:42", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 16266288, - "size_desc": "16.27 MB", - "bitrate": 801764, - "extension": "flac" - }, - "hq": { - "size": 6494445, - "size_desc": "6.49 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 3896685, - "size_desc": "3.9 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 2597805, - "size_desc": "2.6 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2099778087" - }, - { - "id": 2738719309, - "rank": 35, - "rank_name": "飙升榜", - "title": "梦蝶", - "artist": [ - { - "id": 27730224, - "name": "回春丹", - "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=27730224" - } - ], - "album": { - "id": 282452357, - "name": "大把时间璀璨", - "cover": "http://p2.music.126.net/_gJgbfqTgWH2T1vk1Br1ig==/109951171911478103.jpg", - "published": "2025-08-25", - "published_at": 1756137600000, - "company": "池沼版全" - }, - "duration": 239939, - "duration_desc": "3:59", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 32723142, - "size_desc": "32.72 MB", - "bitrate": 1090898, - "extension": "flac" - }, - "hq": { - "size": 9600045, - "size_desc": "9.6 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 5760045, - "size_desc": "5.76 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 3840045, - "size_desc": "3.84 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2738719309" - }, - { - "id": 2740511420, - "rank": 36, - "rank_name": "飙升榜", - "title": "WANTCHU (94bpm)", - "artist": [ - { - "id": 12544511, - "name": "keshi", - "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=12544511" - } - ], - "album": { - "id": 283084927, - "name": "WANTCHU (94bpm)", - "cover": "http://p2.music.126.net/6EQM-q53CjlapnKMTOSyKQ==/109951171937786942.jpg", - "published": "2025-08-26", - "published_at": 1756224000000, - "company": "Island Records" - }, - "duration": 254873, - "duration_desc": "4:14", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 29015872, - "size_desc": "29.02 MB", - "bitrate": 910607, - "extension": "flac" - }, - "hq": { - "size": 10197203, - "size_desc": "10.2 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 6118339, - "size_desc": "6.12 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 4078907, - "size_desc": "4.08 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2740511420" - }, - { - "id": 2729743751, - "rank": 37, - "rank_name": "飙升榜", - "title": "Dreamin", - "artist": [ - { - "id": 51253492, - "name": "穆祉丞", - "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=51253492" - } - ], - "album": { - "id": 279543769, - "name": "Dreamin", - "cover": "http://p2.music.126.net/X0NUwa8wMffZGXoPZtNpsA==/109951171517669783.jpg", - "published": "2025-07-27", - "published_at": 1753632000000, - "company": "北京时代峰峻文化艺术发展有限公司" - }, - "duration": 136944, - "duration_desc": "2:16", - "popularity": 95, - "score": 95, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 19166561, - "size_desc": "19.17 MB", - "bitrate": 1119520, - "extension": "flac" - }, - "hq": { - "size": 5480685, - "size_desc": "5.48 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 3288429, - "size_desc": "3.29 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 2192301, - "size_desc": "2.19 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2729743751" - }, - { - "id": 2729689943, - "rank": 38, - "rank_name": "飙升榜", - "title": "为时已晚(越大越觉孤单)", - "artist": [ - { - "id": 58568204, - "name": "管小天", - "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=58568204" - } - ], - "album": { - "id": 279534034, - "name": "为时已晚", - "cover": "http://p2.music.126.net/xSs5l9BWlKJGqXdH3SW_oA==/109951171516866306.jpg", - "published": "2025-07-24", - "published_at": 1753372800000, - "company": "看见音乐" - }, - "duration": 204218, - "duration_desc": "3:24", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 18189938, - "size_desc": "18.19 MB", - "bitrate": 712421, - "extension": "flac" - }, - "hq": { - "size": 8171146, - "size_desc": "8.17 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 4902705, - "size_desc": "4.9 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 3268484, - "size_desc": "3.27 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2729689943" - }, - { - "id": 2736196294, - "rank": 39, - "rank_name": "飙升榜", - "title": "你啊你,我的心", - "artist": [ - { - "id": 37092139, - "name": "babychair", - "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=37092139" - }, - { - "id": 12789956, - "name": "陈婧霏", - "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=12789956" - } - ], - "album": { - "id": 281535136, - "name": "你啊你,我的心", - "cover": "http://p2.music.126.net/zWRB5KYDrulefgh_FVzIfw==/109951171865682128.jpg", - "published": "2025-08-18", - "published_at": 1755532800000, - "company": "网易云音乐|网易音乐人 x 中国数字音乐基地" - }, - "duration": 199621, - "duration_desc": "3:19", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 17022552, - "size_desc": "17.02 MB", - "bitrate": 682047, - "extension": "flac" - }, - "hq": { - "size": 7987245, - "size_desc": "7.99 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 4792365, - "size_desc": "4.79 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 3194925, - "size_desc": "3.19 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2736196294" - }, - { - "id": 27955654, - "rank": 40, - "rank_name": "飙升榜", - "title": "其实", - "artist": [ - { - "id": 5781, - "name": "薛之谦", - "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=5781" - } - ], - "album": { - "id": 2681139, - "name": "意外", - "cover": "http://p2.music.126.net/ywVjRpbu9KpcBQh9KJz2HA==/109951164499974026.jpg", - "published": "2013-11-10", - "published_at": 1384099200000, - "company": "潮石音乐" - }, - "duration": 242146, - "duration_desc": "4:02", - "popularity": 100, - "score": 100, - "fee": 1, - "status": 0, - "mb": { - "sq": { - "size": 23339701, - "size_desc": "23.34 MB", - "bitrate": 771093, - "extension": "flac" - }, - "hq": { - "size": 9688338, - "size_desc": "9.69 MB", - "bitrate": 320002, - "extension": "mp3" - }, - "mq": { - "size": 5813020, - "size_desc": "5.81 MB", - "bitrate": 192002, - "extension": "mp3" - }, - "lq": { - "size": 3875361, - "size_desc": "3.88 MB", - "bitrate": 128001, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=27955654" - }, - { - "id": 2738459901, - "rank": 41, - "rank_name": "飙升榜", - "title": "空心人札记", - "artist": [ - { - "id": 98856697, - "name": "Calia-林焰", - "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=98856697" - }, - { - "id": 12046092, - "name": "星尘", - "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=12046092" - } - ], - "album": { - "id": 282297325, - "name": "空心人札记", - "cover": "http://p2.music.126.net/7pZP5egJfBxAnJ1xZNdhXg==/109951171906929489.jpg", - "published": "2025-08-19", - "published_at": 1755619200000, - "company": "" - }, - "duration": 178909, - "duration_desc": "2:58", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 22224636, - "size_desc": "22.22 MB", - "bitrate": 993636, - "extension": "flac" - }, - "hq": { - "size": 7158765, - "size_desc": "7.16 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 4295277, - "size_desc": "4.3 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 2863533, - "size_desc": "2.86 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2738459901" - }, - { - "id": 2721839629, - "rank": 42, - "rank_name": "飙升榜", - "title": "Velvet Horizon/天鹅绒地平线", - "artist": [ - { - "id": 97183508, - "name": "朱砂未央", - "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=97183508" - } - ], - "album": { - "id": 275635771, - "name": "Eternal Echoes", - "cover": "http://p2.music.126.net/RxQ2ueBidRYZBCtQTXJdLw==/109951171331877000.jpg", - "published": "2025-06-18", - "published_at": 1750262400000, - "company": "" - }, - "duration": 203149, - "duration_desc": "3:23", - "popularity": 95, - "score": 95, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 20906818, - "size_desc": "20.91 MB", - "bitrate": 823160, - "extension": "flac" - }, - "hq": { - "size": 8128365, - "size_desc": "8.13 MB", - "bitrate": 320002, - "extension": "mp3" - }, - "mq": { - "size": 4877037, - "size_desc": "4.88 MB", - "bitrate": 192002, - "extension": "mp3" - }, - "lq": { - "size": 3251373, - "size_desc": "3.25 MB", - "bitrate": 128002, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2721839629" - }, - { - "id": 63574, - "rank": 43, - "rank_name": "飙升榜", - "title": "背叛", - "artist": [ - { - "id": 2110, - "name": "曹格", - "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=2110" - } - ], - "album": { - "id": 6295, - "name": "Superman", - "cover": "http://p2.music.126.net/eDinSMXNYMZHP9nAZ_sQkw==/48378511634444.jpg", - "published": "2006-12-26", - "published_at": 1167148800000, - "company": "滚石唱片" - }, - "duration": 321629, - "duration_desc": "5:21", - "popularity": 100, - "score": 100, - "fee": 1, - "status": 0, - "mb": { - "sq": { - "size": 34294620, - "size_desc": "34.29 MB", - "bitrate": 853022, - "extension": "flac" - }, - "hq": { - "size": 12867962, - "size_desc": "12.87 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 7720795, - "size_desc": "7.72 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 5147211, - "size_desc": "5.15 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=63574" - }, - { - "id": 2738719310, - "rank": 44, - "rank_name": "飙升榜", - "title": "福寿螺", - "artist": [ - { - "id": 27730224, - "name": "回春丹", - "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=27730224" - } - ], - "album": { - "id": 282452357, - "name": "大把时间璀璨", - "cover": "http://p2.music.126.net/_gJgbfqTgWH2T1vk1Br1ig==/109951171911478103.jpg", - "published": "2025-08-25", - "published_at": 1756137600000, - "company": "池沼版全" - }, - "duration": 171106, - "duration_desc": "2:51", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 22295052, - "size_desc": "22.3 MB", - "bitrate": 1042244, - "extension": "flac" - }, - "hq": { - "size": 6846765, - "size_desc": "6.85 MB", - "bitrate": 320002, - "extension": "mp3" - }, - "mq": { - "size": 4108077, - "size_desc": "4.11 MB", - "bitrate": 192002, - "extension": "mp3" - }, - "lq": { - "size": 2738733, - "size_desc": "2.74 MB", - "bitrate": 128002, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2738719310" - }, - { - "id": 2730270719, - "rank": 45, - "rank_name": "飙升榜", - "title": "Hollow", - "artist": [ - { - "id": 1132066, - "name": "Fayzz", - "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=1132066" - } - ], - "album": { - "id": 279675457, - "name": "Patch", - "cover": "http://p2.music.126.net/AmLRTNKjHJwOo11jlQX0lw==/109951171525802692.jpg", - "published": "2025-08-04", - "published_at": 1754323200000, - "company": "HIFIVE" - }, - "duration": 360000, - "duration_desc": "6:00", - "popularity": 90, - "score": 90, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 44161333, - "size_desc": "44.16 MB", - "bitrate": 981217, - "extension": "flac" - }, - "hq": { - "size": 14401965, - "size_desc": "14.4 MB", - "bitrate": 320001, - "extension": "mp3" - }, - "mq": { - "size": 8641197, - "size_desc": "8.64 MB", - "bitrate": 192001, - "extension": "mp3" - }, - "lq": { - "size": 5760813, - "size_desc": "5.76 MB", - "bitrate": 128001, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2730270719" - }, - { - "id": 2738719307, - "rank": 46, - "rank_name": "飙升榜", - "title": "降临", - "artist": [ - { - "id": 27730224, - "name": "回春丹", - "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=27730224" - } - ], - "album": { - "id": 282452357, - "name": "大把时间璀璨", - "cover": "http://p2.music.126.net/_gJgbfqTgWH2T1vk1Br1ig==/109951171911478103.jpg", - "published": "2025-08-25", - "published_at": 1756137600000, - "company": "池沼版全" - }, - "duration": 330139, - "duration_desc": "5:30", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 41595472, - "size_desc": "41.6 MB", - "bitrate": 1007803, - "extension": "flac" - }, - "hq": { - "size": 13207725, - "size_desc": "13.21 MB", - "bitrate": 320001, - "extension": "mp3" - }, - "mq": { - "size": 7924653, - "size_desc": "7.92 MB", - "bitrate": 192001, - "extension": "mp3" - }, - "lq": { - "size": 5283117, - "size_desc": "5.28 MB", - "bitrate": 128001, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2738719307" - }, - { - "id": 2730270717, - "rank": 47, - "rank_name": "飙升榜", - "title": "隐藏(Hide)", - "artist": [ - { - "id": 1132066, - "name": "Fayzz", - "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=1132066" - } - ], - "album": { - "id": 279675457, - "name": "Patch", - "cover": "http://p1.music.126.net/AmLRTNKjHJwOo11jlQX0lw==/109951171525802692.jpg", - "published": "2025-08-04", - "published_at": 1754323200000, - "company": "HIFIVE" - }, - "duration": 306000, - "duration_desc": "5:06", - "popularity": 90, - "score": 90, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 31438598, - "size_desc": "31.44 MB", - "bitrate": 821778, - "extension": "flac" - }, - "hq": { - "size": 12241965, - "size_desc": "12.24 MB", - "bitrate": 320001, - "extension": "mp3" - }, - "mq": { - "size": 7345197, - "size_desc": "7.35 MB", - "bitrate": 192001, - "extension": "mp3" - }, - "lq": { - "size": 4896813, - "size_desc": "4.9 MB", - "bitrate": 128001, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2730270717" - }, - { - "id": 413812470, - "rank": 48, - "rank_name": "飙升榜", - "title": "One More Time", - "artist": [ - { - "id": 29959, - "name": "Craig David", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=29959" - } - ], - "album": { - "id": 34701579, - "name": "One More Time", - "cover": "http://p1.music.126.net/yGOnOKbJYXd7O_h0Ns_W_w==/1390882218000288.jpg", - "published": "2016-05-19", - "published_at": 1463673600007, - "company": "索尼音乐" - }, - "duration": 194520, - "duration_desc": "3:14", - "popularity": 100, - "score": 100, - "fee": 1, - "status": 0, - "mb": { - "sq": { - "size": 40301209, - "size_desc": "40.3 MB", - "bitrate": 1657462, - "extension": "flac" - }, - "hq": { - "size": 7783489, - "size_desc": "7.78 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 4670111, - "size_desc": "4.67 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 3113422, - "size_desc": "3.11 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=413812470" - }, - { - "id": 2740182817, - "rank": 49, - "rank_name": "飙升榜", - "title": "暗码", - "artist": [ - { - "id": 12236269, - "name": "高天佐", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=12236269" - }, - { - "id": 12085066, - "name": "ZIV", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=12085066" - } - ], - "album": { - "id": 282953625, - "name": "暗码", - "cover": "http://p1.music.126.net/zUqNfcfmNePSEazkOt9KXg==/109951171933460415.jpg", - "published": "2025-08-27", - "published_at": 1756310400000, - "company": "" - }, - "duration": 186838, - "duration_desc": "3:06", - "popularity": 95, - "score": 95, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 22486402, - "size_desc": "22.49 MB", - "bitrate": 962670, - "extension": "flac" - }, - "hq": { - "size": 7475565, - "size_desc": "7.48 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 4485357, - "size_desc": "4.49 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 2990253, - "size_desc": "2.99 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2740182817" - }, - { - "id": 2735983727, - "rank": 50, - "rank_name": "飙升榜", - "title": "光影戒断反应.wav", - "artist": [ - { - "id": 99613013, - "name": "云落", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=99613013" - } - ], - "album": { - "id": 281406500, - "name": "光影戒断反应", - "cover": "http://p1.music.126.net/BZYzH0ODE-ypCtJvC6_x7w==/109951171857042141.jpg", - "published": "2025-08-12", - "published_at": 1755014400000, - "company": "" - }, - "duration": 275439, - "duration_desc": "4:35", - "popularity": 95, - "score": 95, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 31477192, - "size_desc": "31.48 MB", - "bitrate": 914091, - "extension": "flac" - }, - "hq": { - "size": 11019885, - "size_desc": "11.02 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 6611949, - "size_desc": "6.61 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 4407981, - "size_desc": "4.41 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2735983727" - }, - { - "id": 2738715963, - "rank": 51, - "rank_name": "飙升榜", - "title": "宝藏", - "artist": [ - { - "id": 27730224, - "name": "回春丹", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=27730224" - } - ], - "album": { - "id": 282452357, - "name": "大把时间璀璨", - "cover": "http://p1.music.126.net/_gJgbfqTgWH2T1vk1Br1ig==/109951171911478103.jpg", - "published": "2025-08-25", - "published_at": 1756137600000, - "company": "池沼版全" - }, - "duration": 174001, - "duration_desc": "2:54", - "popularity": 95, - "score": 95, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 23432952, - "size_desc": "23.43 MB", - "bitrate": 1077220, - "extension": "flac" - }, - "hq": { - "size": 6962925, - "size_desc": "6.96 MB", - "bitrate": 320002, - "extension": "mp3" - }, - "mq": { - "size": 4177773, - "size_desc": "4.18 MB", - "bitrate": 192002, - "extension": "mp3" - }, - "lq": { - "size": 2785197, - "size_desc": "2.79 MB", - "bitrate": 128002, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2738715963" - }, - { - "id": 2730600192, - "rank": 52, - "rank_name": "飙升榜", - "title": "Out of my system", - "artist": [ - { - "id": 95288932, - "name": "Nia Nkuna", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=95288932" - } - ], - "album": { - "id": 279776498, - "name": "Mixed signals", - "cover": "http://p1.music.126.net/ulsDcoiZogmbQ96YccOp3g==/109951171529990940.jpg", - "published": "2025-08-06", - "published_at": 1754496000000, - "company": "7296470 Records DK2" - }, - "duration": 211039, - "duration_desc": "3:31", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 26480510, - "size_desc": "26.48 MB", - "bitrate": 1003662, - "extension": "flac" - }, - "hq": { - "size": 8444205, - "size_desc": "8.44 MB", - "bitrate": 320002, - "extension": "mp3" - }, - "mq": { - "size": 5066541, - "size_desc": "5.07 MB", - "bitrate": 192002, - "extension": "mp3" - }, - "lq": { - "size": 3377709, - "size_desc": "3.38 MB", - "bitrate": 128002, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2730600192" - }, - { - "id": 2739853860, - "rank": 53, - "rank_name": "飙升榜", - "title": "幻想彼岸", - "artist": [ - { - "id": 95441940, - "name": "Tekoo", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=95441940" - }, - { - "id": 29303235, - "name": "PSY.P", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=29303235" - } - ], - "album": { - "id": 282839523, - "name": "幻想彼岸", - "cover": "http://p1.music.126.net/Gi4zmlg7bemQ7_TG5QLI0w==/109951171928760549.jpg", - "published": "2025-08-25", - "published_at": 1756137600000, - "company": "" - }, - "duration": 154532, - "duration_desc": "2:34", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 15954957, - "size_desc": "15.95 MB", - "bitrate": 825824, - "extension": "flac" - }, - "hq": { - "size": 6183405, - "size_desc": "6.18 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 3710061, - "size_desc": "3.71 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 2473389, - "size_desc": "2.47 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2739853860" - }, - { - "id": 2715139032, - "rank": 54, - "rank_name": "飙升榜", - "title": "Got It Now (Phonk)", - "artist": [ - { - "id": 52436538, - "name": "YaKio", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=52436538" - }, - { - "id": 96953508, - "name": "Wehti", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=96953508" - }, - { - "id": 48853047, - "name": "VZEUS", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=48853047" - }, - { - "id": 48855131, - "name": "离离离", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=48855131" - } - ], - "album": { - "id": 275048395, - "name": "Got It Now (Phonk)", - "cover": "http://p1.music.126.net/zmottkLtPAA6_xz4ywWXhA==/109951171301374976.jpg", - "published": "2025-06-12", - "published_at": 1749744000000, - "company": "" - }, - "duration": 113170, - "duration_desc": "1:53", - "popularity": 95, - "score": 95, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 13958890, - "size_desc": "13.96 MB", - "bitrate": 986598, - "extension": "flac" - }, - "hq": { - "size": 4529676, - "size_desc": "4.53 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 2717823, - "size_desc": "2.72 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 1811897, - "size_desc": "1.81 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2715139032" - }, - { - "id": 2730268845, - "rank": 55, - "rank_name": "飙升榜", - "title": "Intro", - "artist": [ - { - "id": 1132066, - "name": "Fayzz", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=1132066" - } - ], - "album": { - "id": 279675457, - "name": "Patch", - "cover": "http://p1.music.126.net/AmLRTNKjHJwOo11jlQX0lw==/109951171525802692.jpg", - "published": "2025-08-04", - "published_at": 1754323200000, - "company": "HIFIVE" - }, - "duration": 122000, - "duration_desc": "2:02", - "popularity": 90, - "score": 90, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 11610545, - "size_desc": "11.61 MB", - "bitrate": 761197, - "extension": "flac" - }, - "hq": { - "size": 4882605, - "size_desc": "4.88 MB", - "bitrate": 320003, - "extension": "mp3" - }, - "mq": { - "size": 2929581, - "size_desc": "2.93 MB", - "bitrate": 192003, - "extension": "mp3" - }, - "lq": { - "size": 1953069, - "size_desc": "1.95 MB", - "bitrate": 128003, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2730268845" - }, - { - "id": 2730268846, - "rank": 56, - "rank_name": "飙升榜", - "title": "Forlorn Hope", - "artist": [ - { - "id": 1132066, - "name": "Fayzz", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=1132066" - } - ], - "album": { - "id": 279675457, - "name": "Patch", - "cover": "http://p1.music.126.net/AmLRTNKjHJwOo11jlQX0lw==/109951171525802692.jpg", - "published": "2025-08-04", - "published_at": 1754323200000, - "company": "HIFIVE" - }, - "duration": 371000, - "duration_desc": "6:11", - "popularity": 90, - "score": 90, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 47693449, - "size_desc": "47.69 MB", - "bitrate": 1028284, - "extension": "flac" - }, - "hq": { - "size": 14842605, - "size_desc": "14.84 MB", - "bitrate": 320001, - "extension": "mp3" - }, - "mq": { - "size": 8905581, - "size_desc": "8.91 MB", - "bitrate": 192001, - "extension": "mp3" - }, - "lq": { - "size": 5937069, - "size_desc": "5.94 MB", - "bitrate": 128001, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2730268846" - }, - { - "id": 2739834858, - "rank": 57, - "rank_name": "飙升榜", - "title": "调色板", - "artist": [ - { - "id": 37334229, - "name": "Sasuke", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=37334229" - } - ], - "album": { - "id": 282832994, - "name": "调色板", - "cover": "http://p1.music.126.net/F2fIIywgZ-U8-jGQnlWj-A==/109951171928465892.jpg", - "published": "2025-08-25", - "published_at": 1756137600000, - "company": "" - }, - "duration": 176206, - "duration_desc": "2:56", - "popularity": 95, - "score": 95, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 21253895, - "size_desc": "21.25 MB", - "bitrate": 964805, - "extension": "flac" - }, - "hq": { - "size": 7050285, - "size_desc": "7.05 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 4230189, - "size_desc": "4.23 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 2820141, - "size_desc": "2.82 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2739834858" - }, - { - "id": 2605650585, - "rank": 58, - "rank_name": "飙升榜", - "title": "Baigasai 想要有你在", - "artist": [ - { - "id": 31001926, - "name": "Bohbat", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=31001926" - }, - { - "id": 94228106, - "name": "Suie", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=94228106" - }, - { - "id": 34279887, - "name": "布和都古仁", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=34279887" - } - ], - "album": { - "id": 241400517, - "name": "Baigasai(想要有你在)", - "cover": "http://p1.music.126.net/zA3k1aD3PRCDnmSI9zDqsw==/109951169757659301.jpg", - "published": "2024-07-06", - "published_at": 1720281600000, - "company": "" - }, - "duration": 170623, - "duration_desc": "2:50", - "popularity": 95, - "score": 95, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 17200040, - "size_desc": "17.2 MB", - "bitrate": 806455, - "extension": "flac" - }, - "hq": { - "size": 6827565, - "size_desc": "6.83 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 4096557, - "size_desc": "4.1 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 2731053, - "size_desc": "2.73 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2605650585" - }, - { - "id": 2730270720, - "rank": 59, - "rank_name": "飙升榜", - "title": "季风(Monsoon)", - "artist": [ - { - "id": 1132066, - "name": "Fayzz", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=1132066" - } - ], - "album": { - "id": 279675457, - "name": "Patch", - "cover": "http://p1.music.126.net/AmLRTNKjHJwOo11jlQX0lw==/109951171525802692.jpg", - "published": "2025-08-04", - "published_at": 1754323200000, - "company": "HIFIVE" - }, - "duration": 279500, - "duration_desc": "4:39", - "popularity": 90, - "score": 90, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 34576225, - "size_desc": "34.58 MB", - "bitrate": 989513, - "extension": "flac" - }, - "hq": { - "size": 11182125, - "size_desc": "11.18 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 6709293, - "size_desc": "6.71 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 4472877, - "size_desc": "4.47 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2730270720" - }, - { - "id": 167655, - "rank": 60, - "rank_name": "飙升榜", - "title": "幻听", - "artist": [ - { - "id": 5771, - "name": "许嵩", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=5771" - } - ], - "album": { - "id": 16932, - "name": "梦游计", - "cover": "http://p1.music.126.net/IYgyEjL7w4xwPfyNDw8OzA==/109951169525619688.jpg", - "published": "2012-07-10", - "published_at": 1341936000000, - "company": "海蝶" - }, - "duration": 273266, - "duration_desc": "4:33", - "popularity": 100, - "score": 100, - "fee": 1, - "status": 0, - "mb": { - "sq": { - "size": 26751365, - "size_desc": "26.75 MB", - "bitrate": 783157, - "extension": "flac" - }, - "hq": { - "size": 10932811, - "size_desc": "10.93 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 6559704, - "size_desc": "6.56 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 4373151, - "size_desc": "4.37 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=167655" - }, - { - "id": 642723, - "rank": 61, - "rank_name": "飙升榜", - "title": "17", - "artist": [ - { - "id": 17635, - "name": "椎名林檎", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=17635" - } - ], - "album": { - "id": 61637, - "name": "罪と罰", - "cover": "http://p1.music.126.net/W3zh73z9SEOVx4IugvgQ-g==/109951163318826464.jpg", - "published": "2000-01-25", - "published_at": 948816000000, - "company": "Universal Music LLC" - }, - "duration": 272625, - "duration_desc": "4:32", - "popularity": 100, - "score": 100, - "fee": 1, - "status": 0, - "mb": { - "sq": { - "size": 59365794, - "size_desc": "59.37 MB", - "bitrate": 1742046, - "extension": "flac" - }, - "hq": { - "size": 10907733, - "size_desc": "10.91 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 6544657, - "size_desc": "6.54 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 4363119, - "size_desc": "4.36 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=642723" - }, - { - "id": 429348598, - "rank": 62, - "rank_name": "飙升榜", - "title": "沦陷", - "artist": [ - { - "id": 1081293, - "name": "李嘉格", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=1081293" - } - ], - "album": { - "id": 34841497, - "name": "四格", - "cover": "http://p1.music.126.net/svLJT1S1O0DXHRIghiuJyg==/18599338695655987.jpg", - "published": "2016-03-01", - "published_at": 1456848000000, - "company": "梦响当然" - }, - "duration": 258933, - "duration_desc": "4:18", - "popularity": 100, - "score": 100, - "fee": 1, - "status": 0, - "mb": { - "sq": { - "size": 30269959, - "size_desc": "30.27 MB", - "bitrate": 935220, - "extension": "flac" - }, - "hq": { - "size": 10360207, - "size_desc": "10.36 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 6216142, - "size_desc": "6.22 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 4144109, - "size_desc": "4.14 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=429348598" - }, - { - "id": 2678794854, - "rank": 63, - "rank_name": "飙升榜", - "title": "MISERICÓRDIA GALLARDO", - "artist": [ - { - "id": 34342469, - "name": "Prompto", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=34342469" - } - ], - "album": { - "id": 264022495, - "name": "MISERICÓRDIA GALLARDO", - "cover": "http://p1.music.126.net/JJYwOODi3m-YkPwAXeeiFA==/109951170518532282.jpg", - "published": "2025-03-06", - "published_at": 1741276800000, - "company": "Prompto Productions" - }, - "duration": 96000, - "duration_desc": "1:36", - "popularity": 95, - "score": 95, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 11096948, - "size_desc": "11.1 MB", - "bitrate": 924594, - "extension": "flac" - }, - "hq": { - "size": 3841965, - "size_desc": "3.84 MB", - "bitrate": 320004, - "extension": "mp3" - }, - "mq": { - "size": 2305197, - "size_desc": "2.31 MB", - "bitrate": 192004, - "extension": "mp3" - }, - "lq": { - "size": 1536813, - "size_desc": "1.54 MB", - "bitrate": 128004, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2678794854" - }, - { - "id": 1859339684, - "rank": 64, - "rank_name": "飙升榜", - "title": "般配", - "artist": [ - { - "id": 12471927, - "name": "江皓南", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=12471927" - } - ], - "album": { - "id": 130039504, - "name": "般配", - "cover": "http://p1.music.126.net/_8D98wTjXWMhYl5Bofui0w==/109951166155884642.jpg", - "published": "2021-07-09", - "published_at": 1625846400000, - "company": "" - }, - "duration": 181500, - "duration_desc": "3:01", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 37682299, - "size_desc": "37.68 MB", - "bitrate": 1660927, - "extension": "flac" - }, - "hq": { - "size": 7263129, - "size_desc": "7.26 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 4357895, - "size_desc": "4.36 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 2905278, - "size_desc": "2.91 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=1859339684" - }, - { - "id": 2730270721, - "rank": 65, - "rank_name": "飙升榜", - "title": "Distance", - "artist": [ - { - "id": 1132066, - "name": "Fayzz", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=1132066" - } - ], - "album": { - "id": 279675457, - "name": "Patch", - "cover": "http://p1.music.126.net/AmLRTNKjHJwOo11jlQX0lw==/109951171525802692.jpg", - "published": "2025-08-04", - "published_at": 1754323200000, - "company": "HIFIVE" - }, - "duration": 301250, - "duration_desc": "5:01", - "popularity": 90, - "score": 90, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 31481807, - "size_desc": "31.48 MB", - "bitrate": 835885, - "extension": "flac" - }, - "hq": { - "size": 12052845, - "size_desc": "12.05 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 7231725, - "size_desc": "7.23 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 4821165, - "size_desc": "4.82 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2730270721" - }, - { - "id": 1919524295, - "rank": 66, - "rank_name": "飙升榜", - "title": "问情", - "artist": [ - { - "id": 29234568, - "name": "陈亦洺", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=29234568" - }, - { - "id": 13699766, - "name": "尚辰", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=13699766" - } - ], - "album": { - "id": 140260623, - "name": "问情", - "cover": "http://p1.music.126.net/6_Skolb_X075lr2gSwQNew==/109951167039546994.jpg", - "published": "2022-02-15", - "published_at": 1644940800000, - "company": "雪球音乐" - }, - "duration": 247134, - "duration_desc": "4:07", - "popularity": 100, - "score": 100, - "fee": 1, - "status": 0, - "mb": { - "sq": { - "size": 31029712, - "size_desc": "31.03 MB", - "bitrate": 1004465, - "extension": "flac" - }, - "hq": { - "size": 9887913, - "size_desc": "9.89 MB", - "bitrate": 320001, - "extension": "mp3" - }, - "mq": { - "size": 5932765, - "size_desc": "5.93 MB", - "bitrate": 192001, - "extension": "mp3" - }, - "lq": { - "size": 3955191, - "size_desc": "3.96 MB", - "bitrate": 128001, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=1919524295" - }, - { - "id": 2600493765, - "rank": 67, - "rank_name": "飙升榜", - "title": "恋人", - "artist": [ - { - "id": 4292, - "name": "李荣浩", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=4292" - } - ], - "album": { - "id": 250748750, - "name": "黑马", - "cover": "http://p1.music.126.net/0bk3Iqe2OZGBH2Iuyx7RzA==/109951170045577565.jpg", - "published": "2024-10-17", - "published_at": 1729180800000, - "company": "一样音乐" - }, - "duration": 275912, - "duration_desc": "4:35", - "popularity": 100, - "score": 100, - "fee": 1, - "status": 0, - "mb": { - "sq": { - "size": 30058936, - "size_desc": "30.06 MB", - "bitrate": 871549, - "extension": "flac" - }, - "hq": { - "size": 11039085, - "size_desc": "11.04 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 6623469, - "size_desc": "6.62 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 4415661, - "size_desc": "4.42 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2600493765" - }, - { - "id": 1893505014, - "rank": 68, - "rank_name": "飙升榜", - "title": "年轮说", - "artist": [ - { - "id": 10199, - "name": "杨丞琳", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=10199" - } - ], - "album": { - "id": 135874294, - "name": "20首華語重溫經典", - "cover": "http://p1.music.126.net/3Ao29M_Bk9wuMe6Zq6mU2w==/109951168278832954.jpg", - "published": "2021-11-07", - "published_at": 1636300800000, - "company": "UME - Global Clearing House" - }, - "duration": 266452, - "duration_desc": "4:26", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 26845620, - "size_desc": "26.85 MB", - "bitrate": 806014, - "extension": "flac" - }, - "hq": { - "size": 10661138, - "size_desc": "10.66 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 6396700, - "size_desc": "6.4 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 4264481, - "size_desc": "4.26 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=1893505014" - }, - { - "id": 209923, - "rank": 69, - "rank_name": "飙升榜", - "title": "Love Love Love", - "artist": [ - { - "id": 7219, - "name": "蔡依林", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=7219" - } - ], - "album": { - "id": 21343, - "name": "城堡", - "cover": "http://p1.music.126.net/lKIkniPBdOWqZzl1yvgz9g==/109951170708258712.jpg", - "published": "2004-02-26", - "published_at": 1077811200000, - "company": "索尼音乐" - }, - "duration": 229520, - "duration_desc": "3:49", - "popularity": 100, - "score": 100, - "fee": 1, - "status": 0, - "mb": { - "sq": { - "size": 29983141, - "size_desc": "29.98 MB", - "bitrate": 1045072, - "extension": "flac" - }, - "hq": { - "size": 9183652, - "size_desc": "9.18 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 5510209, - "size_desc": "5.51 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 3673487, - "size_desc": "3.67 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=209923" - }, - { - "id": 2724694389, - "rank": 70, - "rank_name": "飙升榜", - "title": "背篓少年", - "artist": [ - { - "id": 54093175, - "name": "TCG尹妹", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=54093175" - } - ], - "album": { - "id": 277990540, - "name": "背篓少年", - "cover": "http://p1.music.126.net/ceoHVs2dvrfX50Ka6z2E9A==/109951171443733631.jpg", - "published": "2025-07-11", - "published_at": 1752249600000, - "company": "太合麦田" - }, - "duration": 153845, - "duration_desc": "2:33", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 21621158, - "size_desc": "21.62 MB", - "bitrate": 1124160, - "extension": "flac" - }, - "hq": { - "size": 6156525, - "size_desc": "6.16 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 3693933, - "size_desc": "3.69 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 2462637, - "size_desc": "2.46 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2724694389" - }, - { - "id": 1407658105, - "rank": 71, - "rank_name": "飙升榜", - "title": "我要找到你", - "artist": [ - { - "id": 5998, - "name": "易泽禹", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=5998" - } - ], - "album": { - "id": 83891446, - "name": "我要找到你", - "cover": "http://p1.music.126.net/mKjg3atpmn9M4J951CiVTA==/109951164528618554.jpg", - "published": "2019-12-03", - "published_at": 1575388800000, - "company": "" - }, - "duration": 202353, - "duration_desc": "3:22", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 21975656, - "size_desc": "21.98 MB", - "bitrate": 1411000, - "extension": "flac" - }, - "hq": { - "size": 8096958, - "size_desc": "8.1 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 4858192, - "size_desc": "4.86 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 3238809, - "size_desc": "3.24 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=1407658105" - }, - { - "id": 2100282715, - "rank": 72, - "rank_name": "飙升榜", - "title": "歪歪", - "artist": [ - { - "id": 37343207, - "name": "拂言", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=37343207" - } - ], - "album": { - "id": 179091457, - "name": "歪歪", - "cover": "http://p1.music.126.net/G0pr2aux9dzK9hT4-n2n5A==/109951169058424179.jpg", - "published": "2023-11-15", - "published_at": 1700064000000, - "company": "" - }, - "duration": 167927, - "duration_desc": "2:47", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 18617591, - "size_desc": "18.62 MB", - "bitrate": 886934, - "extension": "flac" - }, - "hq": { - "size": 6719085, - "size_desc": "6.72 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 4031469, - "size_desc": "4.03 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 2687661, - "size_desc": "2.69 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2100282715" - }, - { - "id": 2656356278, - "rank": 73, - "rank_name": "飙升榜", - "title": "HARPY HARE", - "artist": [ - { - "id": 59651243, - "name": "NoAki", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=59651243" - }, - { - "id": 12886162, - "name": "Skyver", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=12886162" - } - ], - "album": { - "id": 256868094, - "name": "HARPY HARE", - "cover": "http://p1.music.126.net/y2GIIiHLPFn44tBUGqSBlg==/109951170259120670.jpg", - "published": "2025-01-09", - "published_at": 1736438400000, - "company": "HOUSE OF PHONK" - }, - "duration": 77619, - "duration_desc": "1:17", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 10860026, - "size_desc": "10.86 MB", - "bitrate": 1119303, - "extension": "flac" - }, - "hq": { - "size": 3107570, - "size_desc": "3.11 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 1864560, - "size_desc": "1.86 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 1243054, - "size_desc": "1.24 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2656356278" - }, - { - "id": 2738936457, - "rank": 74, - "rank_name": "飙升榜", - "title": "Can't go back (Live)", - "artist": [ - { - "id": 49141872, - "name": "Top Barry", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=49141872" - } - ], - "album": { - "id": 281143386, - "name": "新说唱2025 第十二期", - "cover": "http://p1.music.126.net/QQsOcKcT6kleCUhIFMn-mg==/109951171834703159.jpg", - "published": "2025-08-22", - "published_at": 1755878400000, - "company": "韶愔音乐娱乐(北京)有限公司" - }, - "duration": 203999, - "duration_desc": "3:23", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 22384573, - "size_desc": "22.38 MB", - "bitrate": 877679, - "extension": "flac" - }, - "hq": { - "size": 8161965, - "size_desc": "8.16 MB", - "bitrate": 320002, - "extension": "mp3" - }, - "mq": { - "size": 4897197, - "size_desc": "4.9 MB", - "bitrate": 192002, - "extension": "mp3" - }, - "lq": { - "size": 3264813, - "size_desc": "3.26 MB", - "bitrate": 128002, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2738936457" - }, - { - "id": 2739501337, - "rank": 75, - "rank_name": "飙升榜", - "title": "余烬", - "artist": [ - { - "id": 48497149, - "name": "柠安", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=48497149" - } - ], - "album": { - "id": 282723264, - "name": "余烬", - "cover": "http://p1.music.126.net/XXwdSc8kr1b9WNCKI7FKHw==/109951171923938239.jpg", - "published": "2025-08-24", - "published_at": 1756051200000, - "company": "" - }, - "duration": 161123, - "duration_desc": "2:41", - "popularity": 90, - "score": 90, - "fee": 8, - "status": 0, - "mb": { - "sq": null, - "hq": { - "size": 6447064, - "size_desc": "6.45 MB", - "bitrate": 320002, - "extension": "mp3" - }, - "mq": { - "size": 3868256, - "size_desc": "3.87 MB", - "bitrate": 192002, - "extension": "mp3" - }, - "lq": { - "size": 2578852, - "size_desc": "2.58 MB", - "bitrate": 128002, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2739501337" - }, - { - "id": 2715166863, - "rank": 76, - "rank_name": "飙升榜", - "title": "雨会告诉你", - "artist": [ - { - "id": 12600046, - "name": "陈文非", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=12600046" - } - ], - "album": { - "id": 275076578, - "name": "我在等世界回电", - "cover": "http://p1.music.126.net/5UG9XVaPOdk7xVMjK6SS5w==/109951171301651895.jpg", - "published": "2025-06-15", - "published_at": 1750003200000, - "company": "海神音乐" - }, - "duration": 240208, - "duration_desc": "4:00", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 25879917, - "size_desc": "25.88 MB", - "bitrate": 861768, - "extension": "flac" - }, - "hq": { - "size": 9610605, - "size_desc": "9.61 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 5766381, - "size_desc": "5.77 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 3844269, - "size_desc": "3.84 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2715166863" - }, - { - "id": 2114019727, - "rank": 77, - "rank_name": "飙升榜", - "title": "Don't Say Goodbye (Interlude) (feat. Lodoni)", - "artist": [ - { - "id": 50848454, - "name": "thirtykay", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=50848454" - }, - { - "id": 49090888, - "name": "LODONI", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=49090888" - } - ], - "album": { - "id": 182366445, - "name": "The Gift of Music", - "cover": "http://p1.music.126.net/on9kaYplg1ozEBx7Ep3G6g==/109951169232504429.jpg", - "published": "2023-12-27", - "published_at": 1703692800000, - "company": "3377803 Records DK" - }, - "duration": 149347, - "duration_desc": "2:29", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 15661502, - "size_desc": "15.66 MB", - "bitrate": 838931, - "extension": "flac" - }, - "hq": { - "size": 5976860, - "size_desc": "5.98 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 3586133, - "size_desc": "3.59 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 2390770, - "size_desc": "2.39 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2114019727" - }, - { - "id": 29567193, - "rank": 78, - "rank_name": "飙升榜", - "title": "我们的时光", - "artist": [ - { - "id": 6731, - "name": "赵雷", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=6731" - } - ], - "album": { - "id": 3048030, - "name": "吉姆餐厅", - "cover": "http://p1.music.126.net/pwcUlwh9MFZ_V3hGBOPaCQ==/109951169213425474.jpg", - "published": "2014-10-18", - "published_at": 1413648000000, - "company": "华宇世博" - }, - "duration": 270746, - "duration_desc": "4:30", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 28479102, - "size_desc": "28.48 MB", - "bitrate": 841498, - "extension": "flac" - }, - "hq": { - "size": 10832501, - "size_desc": "10.83 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 6499518, - "size_desc": "6.5 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 4333026, - "size_desc": "4.33 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=29567193" - }, - { - "id": 2075593054, - "rank": 79, - "rank_name": "飙升榜", - "title": "林宛瑜", - "artist": [ - { - "id": 12563131, - "name": "Rapeter", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=12563131" - } - ], - "album": { - "id": 174245605, - "name": "DirtyGOOD 装乖", - "cover": "http://p1.music.126.net/-RYv_KQ7OjQYENoqhoXDmg==/109951168899147692.jpg", - "published": "2023-09-09", - "published_at": 1694275200000, - "company": "" - }, - "duration": 186109, - "duration_desc": "3:06", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 19086070, - "size_desc": "19.09 MB", - "bitrate": 820423, - "extension": "flac" - }, - "hq": { - "size": 7446765, - "size_desc": "7.45 MB", - "bitrate": 320002, - "extension": "mp3" - }, - "mq": { - "size": 4468077, - "size_desc": "4.47 MB", - "bitrate": 192002, - "extension": "mp3" - }, - "lq": { - "size": 2978733, - "size_desc": "2.98 MB", - "bitrate": 128002, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2075593054" - }, - { - "id": 2677400220, - "rank": 80, - "rank_name": "飙升榜", - "title": "NO HOOK FREESTYLE Pt.4", - "artist": [ - { - "id": 12563131, - "name": "Rapeter", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=12563131" - } - ], - "album": { - "id": 263242113, - "name": "IMGOOD别担心我", - "cover": "http://p1.music.126.net/QpNRZsfMP5J4tOlziA8Pnw==/109951170504642760.jpg", - "published": "2025-02-21", - "published_at": 1740153600000, - "company": "" - }, - "duration": 225000, - "duration_desc": "3:45", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 28370966, - "size_desc": "28.37 MB", - "bitrate": 1008598, - "extension": "flac" - }, - "hq": { - "size": 9001965, - "size_desc": "9 MB", - "bitrate": 320002, - "extension": "mp3" - }, - "mq": { - "size": 5401197, - "size_desc": "5.4 MB", - "bitrate": 192002, - "extension": "mp3" - }, - "lq": { - "size": 3600813, - "size_desc": "3.6 MB", - "bitrate": 128002, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2677400220" - }, - { - "id": 2736690863, - "rank": 81, - "rank_name": "飙升榜", - "title": "MENTE MA", - "artist": [ - { - "id": 48853047, - "name": "VZEUS", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=48853047" - } - ], - "album": { - "id": 281730160, - "name": "MENTA MA", - "cover": "http://p1.music.126.net/Jv1aVe2po_f2bE50czHSEQ==/109951171874809370.jpg", - "published": "2025-08-15", - "published_at": 1755246600000, - "company": "" - }, - "duration": 127399, - "duration_desc": "2:07", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 15420410, - "size_desc": "15.42 MB", - "bitrate": 968172, - "extension": "flac" - }, - "hq": { - "size": 5098101, - "size_desc": "5.1 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 3058878, - "size_desc": "3.06 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 2039266, - "size_desc": "2.04 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2736690863" - }, - { - "id": 2735855320, - "rank": 82, - "rank_name": "飙升榜", - "title": "下课钟声", - "artist": [ - { - "id": 34094059, - "name": "关浩德Walter", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=34094059" - } - ], - "album": { - "id": 281405272, - "name": "下课钟声", - "cover": "http://p1.music.126.net/_7Wa7O6fCdlRrNt17RzdAw==/109951171853737963.jpg", - "published": "2025-08-27", - "published_at": 1756310400000, - "company": "StreetVoice/触底而上DTT" - }, - "duration": 273237, - "duration_desc": "4:33", - "popularity": 95, - "score": 95, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 26949536, - "size_desc": "26.95 MB", - "bitrate": 788897, - "extension": "flac" - }, - "hq": { - "size": 10931565, - "size_desc": "10.93 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 6558957, - "size_desc": "6.56 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 4372653, - "size_desc": "4.37 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2735855320" - }, - { - "id": 2717035826, - "rank": 83, - "rank_name": "飙升榜", - "title": "半情歌", - "artist": [ - { - "id": 12275767, - "name": "step.jad依加", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=12275767" - } - ], - "album": { - "id": 275651228, - "name": "半情歌", - "cover": "http://p1.music.126.net/ROw9CASwYMvQvuDOH6eVbw==/109951171330027735.jpg", - "published": "2025-07-14", - "published_at": 1752508800000, - "company": "华纳音乐" - }, - "duration": 214905, - "duration_desc": "3:34", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 25754214, - "size_desc": "25.75 MB", - "bitrate": 958570, - "extension": "flac" - }, - "hq": { - "size": 8598765, - "size_desc": "8.6 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 5159277, - "size_desc": "5.16 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 3439533, - "size_desc": "3.44 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2717035826" - }, - { - "id": 2735409135, - "rank": 84, - "rank_name": "飙升榜", - "title": "ハンドサイン", - "artist": [ - { - "id": 27889701, - "name": "Kizuna AI", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=27889701" - } - ], - "album": { - "id": 281242596, - "name": "ハンドサイン", - "cover": "http://p1.music.126.net/1gnbsJg2rYHalSxBRSReYA==/109951171840112594.jpg", - "published": "2025-08-19", - "published_at": 1755619200000, - "company": "KizunaAI" - }, - "duration": 238693, - "duration_desc": "3:58", - "popularity": 90, - "score": 90, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 29926707, - "size_desc": "29.93 MB", - "bitrate": 1002871, - "extension": "flac" - }, - "hq": { - "size": 9550125, - "size_desc": "9.55 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 5730093, - "size_desc": "5.73 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 3820077, - "size_desc": "3.82 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2735409135" - }, - { - "id": 2082176014, - "rank": 85, - "rank_name": "飙升榜", - "title": "最后的道别", - "artist": [ - { - "id": 4464, - "name": "梁雨", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=4464" - } - ], - "album": { - "id": 174775874, - "name": "最后的道别", - "cover": "http://p1.music.126.net/EeoTFA6yT1e9k89QblcvHQ==/109951168914975164.jpg", - "published": "2023-09-14", - "published_at": 1694707200000, - "company": "淳music" - }, - "duration": 264444, - "duration_desc": "4:24", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 34255476, - "size_desc": "34.26 MB", - "bitrate": 1036300, - "extension": "flac" - }, - "hq": { - "size": 10580205, - "size_desc": "10.58 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 6348141, - "size_desc": "6.35 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 4232109, - "size_desc": "4.23 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2082176014" - }, - { - "id": 2739596293, - "rank": 86, - "rank_name": "飙升榜", - "title": "五千两百遍", - "artist": [ - { - "id": 34634779, - "name": "999PUNKSTA", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=34634779" - } - ], - "album": { - "id": 282723760, - "name": "五千两百遍", - "cover": "http://p1.music.126.net/d2BE2e7gxx0cKvZh3TiOew==/109951171925663378.jpg", - "published": "2025-08-23", - "published_at": 1755964800000, - "company": "" - }, - "duration": 158261, - "duration_desc": "2:38", - "popularity": 90, - "score": 90, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 30834253, - "size_desc": "30.83 MB", - "bitrate": 1558497, - "extension": "flac" - }, - "hq": { - "size": 6333170, - "size_desc": "6.33 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 3799920, - "size_desc": "3.8 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 2533294, - "size_desc": "2.53 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2739596293" - }, - { - "id": 150422, - "rank": 87, - "rank_name": "飙升榜", - "title": "今天你要嫁给我", - "artist": [ - { - "id": 7219, - "name": "蔡依林", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=7219" - }, - { - "id": 5196, - "name": "陶喆", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=5196" - } - ], - "album": { - "id": 15184, - "name": "太美丽", - "cover": "http://p1.music.126.net/Fq9QNt2SYKvPEL3ipfVc9g==/109951166916020363.jpg", - "published": "2006-08-03", - "published_at": 1154620800000, - "company": "华纳音乐" - }, - "duration": 272066, - "duration_desc": "4:32", - "popularity": 100, - "score": 100, - "fee": 1, - "status": 0, - "mb": { - "sq": { - "size": 31284971, - "size_desc": "31.28 MB", - "bitrate": 919920, - "extension": "flac" - }, - "hq": { - "size": 10885791, - "size_desc": "10.89 MB", - "bitrate": 320001, - "extension": "mp3" - }, - "mq": { - "size": 6531492, - "size_desc": "6.53 MB", - "bitrate": 192001, - "extension": "mp3" - }, - "lq": { - "size": 4354342, - "size_desc": "4.35 MB", - "bitrate": 128001, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=150422" - }, - { - "id": 1958677933, - "rank": 88, - "rank_name": "飙升榜", - "title": "不温暖的歌", - "artist": [ - { - "id": 1204076, - "name": "欧瑞SoulCore", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=1204076" - } - ], - "album": { - "id": 147035916, - "name": "不温暖的歌", - "cover": "http://p1.music.126.net/HnGeUR5qsVmbvtk5LEMvng==/109951167584589643.jpg", - "published": "2022-06-23", - "published_at": 1656000000000, - "company": "" - }, - "duration": 190000, - "duration_desc": "3:10", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 38897482, - "size_desc": "38.9 MB", - "bitrate": 1637788, - "extension": "flac" - }, - "hq": { - "size": 7602721, - "size_desc": "7.6 MB", - "bitrate": 320002, - "extension": "mp3" - }, - "mq": { - "size": 4561650, - "size_desc": "4.56 MB", - "bitrate": 192002, - "extension": "mp3" - }, - "lq": { - "size": 3041115, - "size_desc": "3.04 MB", - "bitrate": 128002, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=1958677933" - }, - { - "id": 2738570393, - "rank": 89, - "rank_name": "飙升榜", - "title": "爱情火车", - "artist": [ - { - "id": 48577041, - "name": "Mikey-18", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=48577041" - }, - { - "id": 37343744, - "name": "Katastic卡老师", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=37343744" - } - ], - "album": { - "id": 282399455, - "name": "爱情火车", - "cover": "http://p1.music.126.net/X7FCkAy-zM3KK3ulekJl-w==/109951171934200418.jpg", - "published": "2025-08-27", - "published_at": 1756310400000, - "company": "网易电波" - }, - "duration": 168874, - "duration_desc": "2:48", - "popularity": 90, - "score": 90, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 19597500, - "size_desc": "19.6 MB", - "bitrate": 928231, - "extension": "flac" - }, - "hq": { - "size": 6757399, - "size_desc": "6.76 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 4054457, - "size_desc": "4.05 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 2702986, - "size_desc": "2.7 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2738570393" - }, - { - "id": 2733116489, - "rank": 90, - "rank_name": "飙升榜", - "title": "云朵的歌", - "artist": [ - { - "id": 29865317, - "name": "斯丹曼簇", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=29865317" - } - ], - "album": { - "id": 280458270, - "name": "云朵的歌", - "cover": "http://p1.music.126.net/EDicVyZ4SZJAnI-RqYLPSw==/109951171914367691.jpg", - "published": "2025-08-22", - "published_at": 1755878400000, - "company": "" - }, - "duration": 254153, - "duration_desc": "4:14", - "popularity": 95, - "score": 95, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 27926440, - "size_desc": "27.93 MB", - "bitrate": 878894, - "extension": "flac" - }, - "hq": { - "size": 10168365, - "size_desc": "10.17 MB", - "bitrate": 320001, - "extension": "mp3" - }, - "mq": { - "size": 6101037, - "size_desc": "6.1 MB", - "bitrate": 192001, - "extension": "mp3" - }, - "lq": { - "size": 4067373, - "size_desc": "4.07 MB", - "bitrate": 128001, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2733116489" - }, - { - "id": 2666658963, - "rank": 91, - "rank_name": "飙升榜", - "title": "Show Me Love", - "artist": [ - { - "id": 31988286, - "name": "WizTheMC", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=31988286" - }, - { - "id": 94332017, - "name": "bees & honey", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=94332017" - } - ], - "album": { - "id": 259913344, - "name": "Show Me Love", - "cover": "http://p1.music.126.net/sPZ1mJ3Rh10cjRenbQ3bAg==/109951170383524946.jpg", - "published": "2025-02-06", - "published_at": 1738857600000, - "company": "Bamboo Artists" - }, - "duration": 176965, - "duration_desc": "2:56", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 34535501, - "size_desc": "34.54 MB", - "bitrate": 1561083, - "extension": "flac" - }, - "hq": { - "size": 7081317, - "size_desc": "7.08 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 4248808, - "size_desc": "4.25 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 2832553, - "size_desc": "2.83 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2666658963" - }, - { - "id": 2740196131, - "rank": 92, - "rank_name": "飙升榜", - "title": "一步几回头", - "artist": [ - { - "id": 31364543, - "name": "蒋孜怡", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=31364543" - } - ], - "album": { - "id": 282958925, - "name": "一步几回头", - "cover": "http://p1.music.126.net/rzb1yI0jHl7jgoUnzZa_qg==/109951171933563007.jpg", - "published": "2025-08-27", - "published_at": 1756310400000, - "company": "Universal Music China" - }, - "duration": 222659, - "duration_desc": "3:42", - "popularity": 90, - "score": 90, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 26687271, - "size_desc": "26.69 MB", - "bitrate": 958706, - "extension": "flac" - }, - "hq": { - "size": 8908844, - "size_desc": "8.91 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 5345324, - "size_desc": "5.35 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 3563564, - "size_desc": "3.56 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2740196131" - }, - { - "id": 2736339025, - "rank": 93, - "rank_name": "飙升榜", - "title": "桃花签", - "artist": [ - { - "id": 1215003, - "name": "呦猫UNEKO", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=1215003" - }, - { - "id": 816079, - "name": "薄彩生", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=816079" - } - ], - "album": { - "id": 281577462, - "name": "《百妖谱·洛阳篇》动画原声带", - "cover": "http://p1.music.126.net/MSfQ702QFv0w2OmifzyJEA==/109951171867725169.jpg", - "published": "2025-08-14", - "published_at": 1755187200000, - "company": "bilibili" - }, - "duration": 239808, - "duration_desc": "3:59", - "popularity": 95, - "score": 95, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 27381733, - "size_desc": "27.38 MB", - "bitrate": 913308, - "extension": "flac" - }, - "hq": { - "size": 9594285, - "size_desc": "9.59 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 5756589, - "size_desc": "5.76 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 3837741, - "size_desc": "3.84 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2736339025" - }, - { - "id": 2652410538, - "rank": 94, - "rank_name": "飙升榜", - "title": "红太狼狂想曲(《喜羊羊与灰太狼之兔年顶呱呱》动画电影插曲)", - "artist": [ - { - "id": 7481, - "name": "崔子格", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=7481" - } - ], - "album": { - "id": 255582143, - "name": "《喜羊羊与灰太狼》音乐原声带合辑", - "cover": "http://p1.music.126.net/KeZoz-csqAe30ovzgDFehQ==/109951170213887287.jpg", - "published": "2024-12-01", - "published_at": 1733068800000, - "company": "宇歌风行" - }, - "duration": 160920, - "duration_desc": "2:40", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 18494176, - "size_desc": "18.49 MB", - "bitrate": 919422, - "extension": "flac" - }, - "hq": { - "size": 6438765, - "size_desc": "6.44 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 3863277, - "size_desc": "3.86 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 2575533, - "size_desc": "2.58 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2652410538" - }, - { - "id": 2733113572, - "rank": 95, - "rank_name": "飙升榜", - "title": "espero(等着你)", - "artist": [ - { - "id": 46957283, - "name": "曼尼洛夫", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=46957283" - }, - { - "id": 12568026, - "name": "小白羊HUSH", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=12568026" - } - ], - "album": { - "id": 280457742, - "name": "espero(等着你)", - "cover": "http://p1.music.126.net/2CY0ZyIyAbCWErHS6VnX5g==/109951171715764900.jpg", - "published": "2025-08-03", - "published_at": 1754236800000, - "company": "独立发行" - }, - "duration": 230999, - "duration_desc": "3:50", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 26319483, - "size_desc": "26.32 MB", - "bitrate": 911350, - "extension": "flac" - }, - "hq": { - "size": 9242166, - "size_desc": "9.24 MB", - "bitrate": 320002, - "extension": "mp3" - }, - "mq": { - "size": 5545317, - "size_desc": "5.55 MB", - "bitrate": 192002, - "extension": "mp3" - }, - "lq": { - "size": 3696893, - "size_desc": "3.7 MB", - "bitrate": 128002, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2733113572" - }, - { - "id": 2738549556, - "rank": 96, - "rank_name": "飙升榜", - "title": "Vai Toma(PHONK)", - "artist": [ - { - "id": 56856041, - "name": "GTR7", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=56856041" - } - ], - "album": { - "id": 282297619, - "name": "Vai Toma", - "cover": "http://p1.music.126.net/crZu8zAKrCR3pN8lzdUUVA==/109951171907812124.jpg", - "published": "2025-08-20", - "published_at": 1755705600000, - "company": "" - }, - "duration": 131000, - "duration_desc": "2:11", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 28401103, - "size_desc": "28.4 MB", - "bitrate": 1734269, - "extension": "flac" - }, - "hq": { - "size": 5242297, - "size_desc": "5.24 MB", - "bitrate": 320003, - "extension": "mp3" - }, - "mq": { - "size": 3145395, - "size_desc": "3.15 MB", - "bitrate": 192003, - "extension": "mp3" - }, - "lq": { - "size": 2096945, - "size_desc": "2.1 MB", - "bitrate": 128003, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2738549556" - }, - { - "id": 2739231169, - "rank": 97, - "rank_name": "飙升榜", - "title": "她走的那夜下起了大雨 (纯音乐)", - "artist": [ - { - "id": 59019507, - "name": "韦大鱼", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=59019507" - } - ], - "album": { - "id": 282657964, - "name": "纯音乐合集", - "cover": "http://p1.music.126.net/cfBzsQXbFCV1E_m5y1ZA3w==/109951171919074070.jpg", - "published": "2025-08-22", - "published_at": 1755878400000, - "company": "广西青衫网络传媒有限公司" - }, - "duration": 188424, - "duration_desc": "3:08", - "popularity": 95, - "score": 95, - "fee": 0, - "status": 0, - "mb": { - "sq": null, - "hq": { - "size": 7538925, - "size_desc": "7.54 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 4523373, - "size_desc": "4.52 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": null - }, - "link": "https://music.163.com/#/song?id=2739231169" - }, - { - "id": 2740703897, - "rank": 98, - "rank_name": "飙升榜", - "title": "Start Today", - "artist": [ - { - "id": 56782, - "name": "Fall Out Boy", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=56782" - } - ], - "album": { - "id": 283140201, - "name": "Start Today", - "cover": "http://p1.music.126.net/gnMq2u8Nhsdewz3nnsEIVA==/109951171940498828.jpg", - "published": "2025-08-26", - "published_at": 1756224000000, - "company": "Island Records" - }, - "duration": 122706, - "duration_desc": "2:02", - "popularity": 90, - "score": 90, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 14898805, - "size_desc": "14.9 MB", - "bitrate": 971194, - "extension": "flac" - }, - "hq": { - "size": 4911064, - "size_desc": "4.91 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 2946656, - "size_desc": "2.95 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 1964452, - "size_desc": "1.96 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2740703897" - }, - { - "id": 2100963421, - "rank": 99, - "rank_name": "飙升榜", - "title": "山海花开不是你", - "artist": [ - { - "id": 12444269, - "name": "高源", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=12444269" - } - ], - "album": { - "id": 179350982, - "name": "山海花开不是你", - "cover": "http://p1.music.126.net/AksAWvy9M90X-quVpRm9aA==/109951169063447299.jpg", - "published": "2023-11-19", - "published_at": 1700409600000, - "company": "音符跳动" - }, - "duration": 194516, - "duration_desc": "3:14", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 21032122, - "size_desc": "21.03 MB", - "bitrate": 864999, - "extension": "flac" - }, - "hq": { - "size": 7782765, - "size_desc": "7.78 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 4669677, - "size_desc": "4.67 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 3113133, - "size_desc": "3.11 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2100963421" - }, - { - "id": 2731613461, - "rank": 100, - "rank_name": "飙升榜", - "title": "不会在乎时间走多快", - "artist": [ - { - "id": 1142011, - "name": "王极", - "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", - "link": "https://music.163.com/#/artist?id=1142011" - } - ], - "album": { - "id": 280119457, - "name": "不会在乎时间走多快", - "cover": "http://p1.music.126.net/QwXt6wm-zpToUdKVa-sXHA==/109951171580254229.jpg", - "published": "2025-08-01", - "published_at": 1754064000000, - "company": "" - }, - "duration": 138929, - "duration_desc": "2:18", - "popularity": 100, - "score": 100, - "fee": 8, - "status": 0, - "mb": { - "sq": { - "size": 16673736, - "size_desc": "16.67 MB", - "bitrate": 959978, - "extension": "flac" - }, - "hq": { - "size": 5559405, - "size_desc": "5.56 MB", - "bitrate": 320000, - "extension": "mp3" - }, - "mq": { - "size": 3335661, - "size_desc": "3.34 MB", - "bitrate": 192000, - "extension": "mp3" - }, - "lq": { - "size": 2223789, - "size_desc": "2.22 MB", - "bitrate": 128000, - "extension": "mp3" - } - }, - "link": "https://music.163.com/#/song?id=2731613461" - } - ] -} \ No newline at end of file diff --git a/frontend/react-app/public/60sapi/生成要求模板.txt b/frontend/react-app/public/60sapi/生成要求模板.txt deleted file mode 100644 index 0a3addc7..00000000 --- a/frontend/react-app/public/60sapi/生成要求模板.txt +++ /dev/null @@ -1,8 +0,0 @@ -1.生成为静态网页,js,css,html分离出来,不要混合在一起放入html里,难以阅读 -2.网页要适配手机端,电脑端和平板端三个设备分别做不同的css格式,优先优化手机端用户体验 -3.网页默认风格以淡绿色清新风格为主,除非用户要求 -4.尽量不要引用外部css,js,实在要引用就使用中国国内的cdn,否则用户可能加载不出来 -5.返回接口.json储存了网页api返回的数据格式 -6.严格按照用户要求执行,不得随意添加什么注解,如“以下数据来自...” -7.接口集合.json保存了所有已知的后端API接口,一个访问不了尝试自动切换另一个 -8.在css中有关背景的css单独一个css文件,方便我直接迁移 \ No newline at end of file diff --git a/frontend/react-app/public/index.html b/frontend/react-app/public/index.html index a9715b67..bd22830c 100644 --- a/frontend/react-app/public/index.html +++ b/frontend/react-app/public/index.html @@ -10,12 +10,12 @@ - + - + @@ -31,7 +31,7 @@ - ✨ 神奇万事通 ✨ + 神奇万事通 + + +
    +

    别踩白方块

    + +
    + +
    + 得分: 0 + 速度: 1.0x +
    +
    + +
    + + +
    + +
    + +
    +
    电脑端:使用 A S D F 键
    +
    手机端:直接点击黑色方块
    +
    +
    +
    + + +
    + +
    + + + + + \ No newline at end of file diff --git a/frontend/smallgame/生成要求.txt b/frontend/smallgame/生成要求.txt new file mode 100644 index 00000000..a1bf9601 --- /dev/null +++ b/frontend/smallgame/生成要求.txt @@ -0,0 +1,6 @@ +1.把js,css,html分开储存,每个功能单独分成每个模块,避免单个文件过大问题 +2.网页适配手机端和电脑端,优先优化手机竖屏游玩体验,所有游戏都是手机竖屏游戏 +3.游戏都是无尽模式,玩到后期越来越困难,游戏玩法尽可能丰富多样 +4.电脑端可以有键盘快捷键操作 +5.最后结束游戏要统计显示玩家获得的最终游戏数据,给玩家成就感 +6.尽量不要在游戏网页中出现网页滚动条,会影响玩家的游玩体验 \ No newline at end of file