chore: add大量静态资源文件

新增了图标、背景图、验证码素材以及音频素材等大量静态资源文件
This commit is contained in:
yangxiangyuan
2026-07-08 10:49:14 +08:00
parent be7c5842f1
commit 5fb62f7900
1188 changed files with 30373 additions and 0 deletions
+9
View File
@@ -0,0 +1,9 @@
{
"_comment": "AI-Lib 工具的前端鉴权配置",
"enable_auth_comment": "true:启用鉴权(需要从导航单点登录);false:开发/测试时可放开",
"enable_auth": true,
"max_age_days_comment": "鉴权 cookie 最大有效天数(1~365)",
"max_age_days": 30,
"cookieName_comment": "AI-Lib 鉴权 cookie 名称,用于标记已登录用户",
"cookieName": "ai_lib_gate"
}
@@ -0,0 +1,5 @@
{
"enable_auth": true,
"max_age_days": 30,
"cookieName": "apple_watch_gate"
}
@@ -0,0 +1,9 @@
{
"_comment": "BOX容灾哨兵工具前端鉴权配置",
"enable_auth_comment": "true:启用鉴权;false:完全放开访问",
"enable_auth": true,
"cookieName_comment": "鉴权 cookie 名称",
"cookieName": "box_disaster_sentinel_gate",
"max_age_days_comment": "鉴权 cookie 的最大有效天数(1~365)",
"max_age_days": 30
}
@@ -0,0 +1,7 @@
{
"_comment": "日程提醒工具的前端鉴权配置",
"enable_auth_comment": "true:启用鉴权(需要导航/登录获得 cookie);false:完全放开访问",
"enable_auth": true,
"max_age_days_comment": "鉴权 cookie 的最大有效天数(1~365),到期后需要重新登录",
"max_age_days": 30
}
@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<text y=".9em" font-size="90">📅</text>
</svg>

After

Width:  |  Height:  |  Size: 113 B

@@ -0,0 +1,9 @@
{
"name": "日历提醒系统",
"short_name": "日历提醒",
"start_url": "/WebApp/index.html",
"display": "standalone",
"background_color": "#ffffff",
"theme_color": "#0d6efd",
"icons": []
}
@@ -0,0 +1,15 @@
{
"_comment": "语音日程工具的前端鉴权配置",
"enable_auth_comment": "true:启用鉴权;false:关闭鉴权并放开访问",
"enable_auth": true,
"max_age_days_comment": "鉴权 Cookie 有效期(天),范围建议 1~365",
"max_age_days": 30,
"cookieName_comment": "鉴权 Cookie 名称,建议保持默认",
"cookieName": "calendar_voice_gate",
"requireGuid_comment": "true:入口必须带 guid 参数;false:允许仅凭 token 或会话访问",
"requireGuid": false,
"guidParam_comment": "URL 中的 GUID 参数名,建议使用小写 guid",
"guidParam": "guid",
"guidValue_comment": "GUID 参数值,建议使用高强度随机长串并定期更换",
"guidValue": "ASDF9-0ASDKFS-KI393-9JJDSFHE-KASDKF"
}
@@ -0,0 +1,7 @@
{
"_comment": "建行私募理财工具的前端鉴权配置",
"enable_auth_comment": "true:启用鉴权(需要从导航登录);false:完全放开访问资金工具",
"enable_auth": true,
"max_age_days_comment": "鉴权 cookie 的最大有效天数(1~365)",
"max_age_days": 30
}
+7
View File
@@ -0,0 +1,7 @@
{
"_comment": "云资源管理工具的前端鉴权配置",
"enable_auth_comment": "true:启用鉴权(需要从导航登录);false:完全放开访问云工具",
"enable_auth": true,
"max_age_days_comment": "鉴权 cookie 的最大有效天数(1~365)",
"max_age_days": 30
}
@@ -0,0 +1,9 @@
{
"_comment": "云笔记工具的前端鉴权配置",
"enable_auth_comment": "true:启用鉴权(登录后才可访问云笔记);false:完全放开访问",
"enable_auth": true,
"cookieName_comment": "云笔记鉴权 cookie 名称(用于标记已登录状态)",
"cookieName": "cloud_notes_gate",
"max_age_days_comment": "鉴权 cookie 的最大有效天数(1~365)",
"max_age_days": 30
}
@@ -0,0 +1,27 @@
{
"name": "tinymce",
"description": "Web based JavaScript HTML WYSIWYG editor control.",
"license": "MIT",
"keywords": [
"wysiwyg",
"tinymce",
"richtext",
"javascript",
"html",
"text",
"rich editor",
"rich text editor",
"rte",
"rich text",
"contenteditable",
"editing"
],
"homepage": "https://www.tiny.cloud/",
"ignore": [
"README.md",
"composer.json",
"package.json",
".npmignore",
"CHANGELOG.md"
]
}
@@ -0,0 +1,52 @@
{
"name": "tinymce/tinymce",
"version": "6.8.3",
"description": "Web based JavaScript HTML WYSIWYG editor control.",
"license": [
"MIT-only"
],
"keywords": [
"wysiwyg",
"tinymce",
"richtext",
"javascript",
"html",
"text",
"rich editor",
"rich text editor",
"rte",
"rich text",
"contenteditable",
"editing"
],
"homepage": "https://www.tiny.cloud/",
"type": "component",
"extra": {
"component": {
"scripts": [
"tinymce.js",
"plugins/*/plugin.js",
"themes/*/theme.js",
"models/*/model.js",
"icons/*/icons.js"
],
"files": [
"tinymce.min.js",
"plugins/*/plugin.min.js",
"themes/*/theme.min.js",
"models/*/model.min.js",
"skins/**",
"icons/*/icons.min.js"
]
}
},
"archive": {
"exclude": [
"README.md",
"bower.js",
"package.json",
".npmignore",
"CHANGELOG.md"
]
}
}
@@ -0,0 +1,32 @@
{
"name": "tinymce",
"version": "6.8.3",
"repository": {
"type": "git",
"url": "https://github.com/tinymce/tinymce.git",
"directory": "modules/tinymce"
},
"description": "Web based JavaScript HTML WYSIWYG editor control.",
"author": "Ephox Corporation DBA Tiny Technologies, Inc",
"main": "tinymce.js",
"types": "tinymce.d.ts",
"license": "MIT",
"keywords": [
"wysiwyg",
"tinymce",
"richtext",
"javascript",
"html",
"text",
"rich editor",
"rich text editor",
"rte",
"rich text",
"contenteditable",
"editing"
],
"homepage": "https://www.tiny.cloud/",
"bugs": {
"url": "https://github.com/tinymce/tinymce/issues"
}
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,9 @@
{
"_comment": "云表格工具的前端鉴权配置",
"enable_auth_comment": "true:启用鉴权;false:放开访问",
"enable_auth": true,
"cookieName_comment": "云表格鉴权 cookie 名称",
"cookieName": "cloud_sheets_gate",
"max_age_days_comment": "鉴权 cookie 最大有效天数(1~365)",
"max_age_days": 30
}
@@ -0,0 +1,9 @@
{
"_comment": "大乐透选号(dlt_draws)工具的鉴权配置",
"cookieName_comment": "用于识别已登录用户的 JWT cookie 名称",
"cookieName": "picker_jwt",
"enableCookieAuth_comment": "true:启用基于 cookie 的鉴权;false:不校验登录状态",
"enableCookieAuth": true,
"max_age_days_comment": "JWT cookie 的最大有效天数(1~365)",
"max_age_days": 30
}
+3
View File
@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<text y=".9em" font-size="90">🎲</text>
</svg>

After

Width:  |  Height:  |  Size: 113 B

@@ -0,0 +1,9 @@
{
"_comment": "文档云管家工具的前端鉴权配置",
"enable_auth_comment": "true:启用鉴权(需导航token握手或已有会话);false:完全放开访问",
"enable_auth": true,
"cookieName_comment": "文档云管家鉴权 cookie 名称(用于标记已登录状态)",
"cookieName": "doc_cloud_keeper_gate",
"max_age_days_comment": "鉴权 cookie 的最大有效天数(1~365)",
"max_age_days": 30
}
+7
View File
@@ -0,0 +1,7 @@
{
"_comment": "记账(Expense)工具的前端鉴权配置",
"enable_auth_comment": "true:启用鉴权(从导航登录后才能访问);false:完全放开访问",
"enable_auth": true,
"max_age_days_comment": "鉴权 cookie 的最大有效天数(1~365)",
"max_age_days": 30
}
@@ -0,0 +1,13 @@
{
"_comment": "健身日志工具的前端鉴权配置",
"enable_auth_comment": "true:启用鉴权;false:暂时对所有访问者开放(无登录限制)",
"enable_auth": true,
"max_age_days_comment": "鉴权 Cookie 有效期(天),范围建议 1~365",
"max_age_days": 30,
"cookieName_comment": "鉴权 Cookie 名称,建议保持默认",
"cookieName": "fitness_diary_gate",
"guidParam_comment": "URL 中的 GUID 参数名,建议使用小写 guid",
"guidParam": "guid",
"guidValue_comment": "GUID 参数值,建议使用高强度随机长串并定期更换",
"guidValue": "F1112aD-CH11ANGE-Ts2s2sO-YW21OUR-Ls1weONG-GU4ffeID"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 169 KiB

+7
View File
@@ -0,0 +1,7 @@
{
"_comment": "资金流水工具的前端鉴权配置",
"enable_auth_comment": "true:启用鉴权(需要从导航登录);false:完全放开访问资金工具",
"enable_auth": true,
"max_age_days_comment": "鉴权 cookie 的最大有效天数(1~365)",
"max_age_days": 30
}
@@ -0,0 +1,9 @@
{
"_comment": "语言行为锁工具的前端鉴权配置",
"enable_auth_comment": "true:启用鉴权(需 token 握手或已有会话);false:关闭鉴权",
"enable_auth": true,
"max_age_days_comment": "鉴权 Cookie 有效期(天),范围建议 1~365",
"max_age_days": 30,
"cookieName_comment": "鉴权 Cookie 名称,建议保持默认",
"cookieName": "language_behavior_lock_gate"
}
@@ -0,0 +1,85 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>关键词设置 - 语言和行为冷静期</title>
<link rel="stylesheet" href="/common/common.css" />
<link rel="stylesheet" href="/tools/language_behavior_lock/language_behavior_lock.css" />
</head>
<body>
<main class="page">
<header class="hero">
<div class="hero-main">
<div>
<h1>关键词设置</h1>
<p>维护黑名单关键词规则,命中后会自动提醒并增加冷静期</p>
</div>
<div class="hero-auth">
<div id="auth-login-box" class="auth-login-inline">
<input id="login-username" autocomplete="username" />
<input id="login-password" type="password" autocomplete="current-password" />
<button id="btn-login" class="btn btn-primary" type="button">登录</button>
</div>
<div id="auth-logged-box" style="display:none">
<div class="auth-row">
<div id="auth-current-user" class="auth-current-user"></div>
<button id="btn-logout" class="btn" type="button">退出登录</button>
</div>
</div>
<div id="auth-status" class="status"></div>
</div>
</div>
</header>
<div id="app-content" style="display:none">
<section class="card">
<h2>黑名单关键词后台维护</h2>
<div class="form-actions">
<button id="btn-back-main" class="btn" type="button">返回主界面</button>
</div>
<div class="grid two">
<label>关键词
<input id="kw-text" placeholder="例如:你怎么这么" />
</label>
<label>适用类型
<select id="kw-type">
<option value="all">全部</option>
<option value="speech">仅发言</option>
<option value="behavior">仅行为</option>
<option value="securities">仅证券</option>
</select>
</label>
<label>风险等级
<select id="kw-level">
<option value="low">低</option>
<option value="medium" selected>中</option>
<option value="high">高</option>
</select>
</label>
<label>加时(分钟)
<input id="kw-extra-minutes" type="number" min="0" step="1" value="15" />
</label>
<label class="full">提示文案
<input id="kw-tip" placeholder="例如:你触发了高风险规则,建议延长冷静时间" />
</label>
</div>
<div class="form-actions">
<button id="btn-keyword-add" class="btn" type="button">新增规则</button>
</div>
<div id="keyword-list" class="list"></div>
<div id="form-status" class="status"></div>
</section>
</div>
</main>
<div id="app-modal" class="modal-mask" style="display:none">
<div class="modal-panel">
<div id="modal-title" class="modal-title"></div>
<div id="modal-message" class="modal-message"></div>
<div id="modal-actions" class="modal-actions"></div>
</div>
</div>
<script src="/tools/language_behavior_lock/keyword_settings.js"></script>
</body>
</html>
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,934 @@
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
@import url('https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,700;1,400&family=Noto+Serif+SC:wght@400;600&family=Courier+Prime:ital@0;1&display=swap');
:root {
--gold: #C9A84C;
--gold-light: #E8D5A3;
--gold-dim: rgba(201,168,76,0.15);
--dark: #0D0D0D;
--dark2: #161616;
--dark3: #1E1E1E;
--text: #F0EDE6;
--text-dim: #9A9080;
--text-faint: rgba(240,237,230,0.35);
--red: #C0392B;
--green: #1D9E75;
--blue: #2E6DA4;
--zh-font: "Microsoft YaHei", "PingFang SC", "Hiragino Sans GB", "Heiti SC", sans-serif;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
background: var(--dark);
color: var(--text);
font-family: 'Noto Serif SC', serif;
min-height: 100vh;
padding: 0;
overflow-x: hidden;
}
/* ── TOP NAV ── */
.top-nav {
display: flex;
align-items: flex-end;
gap: 0;
padding: 28px 24px 0;
border-bottom: 0.5px solid rgba(201,168,76,0.2);
position: relative;
}
.top-nav::before {
content: '华尔街智慧手册';
position: absolute;
top: 14px; left: 24px;
font-family: 'Courier Prime', monospace;
font-size: 12px;
letter-spacing: 0.25em;
color: rgba(201,168,76,0.35);
text-transform: uppercase;
}
.tab-btn {
background: transparent;
border: none;
border-bottom: none;
color: var(--text-dim);
font-family: 'Noto Serif SC', serif;
font-size: 15px;
padding: 10px 22px 12px;
cursor: pointer;
position: relative;
transition: color 0.25s;
letter-spacing: 0.05em;
white-space: nowrap;
}
.tab-btn::after {
content: '';
position: absolute;
bottom: -0.5px; left: 0; right: 0;
height: 1.5px;
background: var(--gold);
transform: scaleX(0);
transition: transform 0.3s ease;
}
.tab-btn.active {
color: var(--gold-light);
}
.tab-btn.active::after {
transform: scaleX(1);
}
.tab-btn:hover:not(.active) {
color: rgba(232,213,163,0.6);
}
/* ── PANELS ── */
.panel { display: none; }
.panel.active { display: block; }
/* ══════════════════════════════════
PANEL 1 — 盈利的代价
══════════════════════════════════ */
.p1-wrap {
padding: 32px 24px 40px;
max-width: 720px;
margin: 0 auto;
}
.p1-header {
text-align: center;
margin-bottom: 36px;
position: relative;
}
body::after {
content: '❝';
position: fixed;
top: 60px; left: 18px;
font-size: 70px;
color: rgba(201,168,76,0.04);
font-family: 'Playfair Display', serif;
pointer-events: none;
}
.week-strip {
display: flex;
align-items: center;
justify-content: center;
gap: 12px;
margin-bottom: 4px;
}
.wline { height: 0.5px; width: 48px; background: linear-gradient(to right, transparent, var(--gold)); }
.wline.r { background: linear-gradient(to left, transparent, var(--gold)); }
.wnum { font-family: 'Playfair Display', serif; font-size: 14px; color: var(--gold); letter-spacing: 0.18em; }
.quote-card {
background: var(--dark2);
border: 0.5px solid rgba(201,168,76,0.18);
border-radius: 2px;
padding: 40px 38px;
position: relative;
animation: cardIn 0.65s ease forwards;
}
/* side nav buttons */
.q-btn-side {
position: absolute;
top: 50%;
transform: translateY(-50%);
z-index: 2;
}
.q-btn-left { left: -60px; }
.q-btn-right { right: -60px; }
@keyframes cardIn {
from { opacity: 0; transform: translateY(10px); }
to { opacity: 1; transform: translateY(0); }
}
.quote-card::before { content: ''; position: absolute; top: 11px; left: 11px; width: 18px; height: 18px; border-top: 1px solid rgba(201,168,76,0.35); border-left: 1px solid rgba(201,168,76,0.35); }
.quote-card::after { content: ''; position: absolute; bottom: 11px; right: 11px; width: 18px; height: 18px; border-bottom: 1px solid rgba(201,168,76,0.35); border-right: 1px solid rgba(201,168,76,0.35); }
.q-theme {
font-family: 'Courier Prime', monospace;
font-size: 12px;
letter-spacing: 0.28em;
color: var(--gold);
opacity: 0.55;
text-transform: uppercase;
margin-bottom: 22px;
}
.q-en {
font-family: 'Playfair Display', serif;
font-style: italic;
font-size: 14px;
line-height: 1.75;
color: var(--gold-light);
margin-bottom: 14px;
}
.q-zh {
font-family: var(--zh-font);
font-size: 16px;
font-weight: 500;
line-height: 1.8;
color: var(--text);
margin-bottom: 8px;
}
.q-colloquial {
font-family: var(--zh-font);
font-size: 14px;
line-height: 1.7;
color: var(--text-dim);
margin-bottom: 20px;
}
.q-divider {
height: 0.5px;
background: linear-gradient(to right, transparent, rgba(201,168,76,0.28), transparent);
margin-bottom: 24px;
}
.q-attr {
display: flex;
align-items: flex-start;
gap: 13px;
margin-bottom: 24px;
}
.q-avatar {
width: 34px; height: 34px;
border-radius: 50%;
border: 1px solid rgba(201,168,76,0.28);
display: flex; align-items: center; justify-content: center;
font-family: 'Playfair Display', serif;
font-size: 15px;
color: var(--gold);
background: rgba(201,168,76,0.05);
flex-shrink: 0; margin-top: 2px;
}
.q-name { font-family: 'Playfair Display', serif; font-size: 16px; color: var(--text); margin-bottom: 3px; }
.q-title { font-family: 'Courier Prime', monospace; font-size: 12px; color: var(--text-dim); letter-spacing: 0.06em; }
.q-insight {
background: rgba(201,168,76,0.035);
border: 0.5px solid rgba(201,168,76,0.1);
border-radius: 1px;
padding: 14px 18px;
}
.q-insight-label {
font-family: 'Courier Prime', monospace;
font-size: 12px;
letter-spacing: 0.2em;
color: var(--gold);
opacity: 0.45;
text-transform: uppercase;
margin-bottom: 7px;
}
.q-insight-text {
font-family: var(--zh-font);
font-size: 15px;
line-height: 1.8;
color: var(--text-dim);
}
/* progress */
.prog-wrap { margin-top: 24px; }
.prog-bar-out { height: 1.5px; background: rgba(201,168,76,0.1); border-radius: 99px; margin-bottom: 7px; overflow: hidden; }
.prog-bar-in { height: 100%; background: linear-gradient(to right, #8B4513, var(--gold)); border-radius: 99px; transition: width 0.5s ease; }
.prog-text { font-family: 'Courier Prime', monospace; font-size: 12px; color: var(--text-dim); text-align: center; letter-spacing: 0.1em; }
/* nav buttons */
.q-nav {
display: flex;
justify-content: center;
gap: 10px;
margin-top: 22px;
}
.q-btn {
background: transparent;
border: 0.5px solid rgba(201,168,76,0.22);
color: var(--gold);
font-family: 'Courier Prime', monospace;
font-size: 12px;
letter-spacing: 0.1em;
padding: 8px 18px;
cursor: pointer;
transition: all 0.2s;
text-transform: uppercase;
}
.q-btn:hover:not(:disabled) { background: rgba(201,168,76,0.07); border-color: rgba(201,168,76,0.45); }
.q-btn.primary { background: rgba(201,168,76,0.08); border-color: rgba(201,168,76,0.35); }
.q-btn:disabled { opacity: 0.25; cursor: not-allowed; }
/* dots */
.week-dots {
display: flex;
justify-content: center;
gap: 4px;
margin-top: 14px;
flex-wrap: wrap;
max-width: 380px;
margin-left: auto;
margin-right: auto;
}
.dot {
width: 4px; height: 4px;
border-radius: 50%;
background: rgba(201,168,76,0.13);
cursor: pointer;
transition: all 0.2s;
}
.dot.active { background: var(--gold); transform: scale(1.5); }
.dot.visited { background: rgba(201,168,76,0.38); }
.footer-line {
text-align: center;
margin-top: 20px;
font-family: 'Courier Prime', monospace;
font-size: 12px;
color: rgba(160,152,128,0.3);
letter-spacing: 0.1em;
}
/* ══════════════════════════════════
PANEL 2 — 本金与子弹
══════════════════════════════════ */
.p2-wrap {
padding: 32px 24px 40px;
max-width: 720px;
margin: 0 auto;
}
.p2-intro {
text-align: center;
margin-bottom: 30px;
}
.p2-title {
font-family: 'Playfair Display', serif;
font-size: 26px;
color: var(--gold-light);
margin-bottom: 6px;
}
.p2-subtitle {
font-family: 'Courier Prime', monospace;
font-size: 12px;
letter-spacing: 0.2em;
color: var(--text-dim);
opacity: 0.6;
}
.p2-section {
margin-bottom: 10px;
border-radius: 2px;
border: 0.5px solid rgba(201,168,76,0.14);
background: var(--dark2);
overflow: hidden;
transition: border-color 0.2s;
}
.p2-section:hover { border-color: rgba(201,168,76,0.28); }
.p2-section-header {
display: flex;
align-items: center;
gap: 14px;
padding: 16px 20px;
cursor: pointer;
user-select: none;
}
.p2-icon {
width: 32px; height: 32px;
border-radius: 50%;
display: flex; align-items: center; justify-content: center;
font-size: 14px;
flex-shrink: 0;
border: 0.5px solid rgba(201,168,76,0.25);
background: rgba(201,168,76,0.06);
}
.p2-section-label {
font-family: 'Noto Serif SC', serif;
font-size: 16px;
color: var(--text);
flex: 1;
}
.p2-section-en {
font-family: 'Courier Prime', monospace;
font-size: 12px;
color: var(--gold);
opacity: 0.5;
letter-spacing: 0.15em;
margin-top: 2px;
}
.p2-chevron {
font-size: 12px;
color: var(--gold);
opacity: 0.4;
transition: transform 0.25s;
}
.p2-section.open .p2-chevron { transform: rotate(90deg); }
.p2-body {
display: none;
padding: 0 20px 20px;
border-top: 0.5px solid rgba(201,168,76,0.1);
}
.p2-section.open .p2-body { display: block; }
.p2-law {
display: flex;
align-items: flex-start;
gap: 14px;
padding: 14px 0;
border-bottom: 0.5px solid rgba(255,255,255,0.04);
}
.p2-law:last-child { border-bottom: none; }
.p2-law-num {
font-family: 'Playfair Display', serif;
font-size: 12px;
color: var(--gold);
opacity: 0.5;
flex-shrink: 0;
width: 20px;
margin-top: 2px;
}
.p2-law-content { flex: 1; }
.p2-law-title {
font-family: var(--zh-font);
font-size: 16px;
color: var(--text);
margin-bottom: 4px;
font-weight: 600;
}
.p2-law-body {
font-family: var(--zh-font);
font-size: 15px;
line-height: 1.85;
color: var(--text-dim);
}
.p2-law-quote {
margin-top: 8px;
padding: 8px 12px;
background: rgba(201,168,76,0.04);
border-left: 1.5px solid rgba(201,168,76,0.25);
font-family: 'Playfair Display', serif;
font-style: italic;
font-size: 14px;
color: rgba(232,213,163,0.7);
line-height: 1.7;
}
.p2-law-tag {
display: inline-block;
margin-top: 8px;
font-family: 'Courier Prime', monospace;
font-size: 12px;
letter-spacing: 0.12em;
padding: 2px 8px;
border-radius: 99px;
border: 0.5px solid rgba(201,168,76,0.2);
color: var(--gold);
opacity: 0.6;
text-transform: uppercase;
}
/* core formula */
.p2-formula {
margin: 20px 0 10px;
background: rgba(201,168,76,0.04);
border: 0.5px solid rgba(201,168,76,0.18);
border-radius: 2px;
padding: 18px 22px;
text-align: center;
}
.p2-formula-label {
font-family: 'Courier Prime', monospace;
font-size: 12px;
letter-spacing: 0.22em;
color: var(--gold);
opacity: 0.45;
text-transform: uppercase;
margin-bottom: 10px;
}
.p2-formula-eq {
font-family: 'Playfair Display', serif;
font-size: 18px;
color: var(--gold-light);
line-height: 1.8;
}
.p2-formula-sub {
font-size: 13px;
color: var(--text-dim);
margin-top: 8px;
line-height: 1.7;
}
</style>
</head>
<body>
<!-- TOP NAVIGATION -->
<div class="top-nav">
<button class="tab-btn active" onclick="switchTab(0, this)">盈利的代价</button>
<button class="tab-btn" onclick="switchTab(1, this)">本金与子弹</button>
</div>
<!-- ══ PANEL 1 ══ -->
<div class="panel active" id="panel0">
<div class="p1-wrap">
<div class="p1-header">
<div class="week-strip">
<div class="wline"></div>
<div class="wnum" id="weekNum">WEEK 1</div>
<div class="wline r"></div>
</div>
</div>
<div class="quote-card" id="quoteCard">
<button class="q-btn q-btn-side q-btn-left" id="prevBtn" onclick="changeWeek(-1)">← 上一周</button>
<button class="q-btn q-btn-side q-btn-right" id="nextBtn" onclick="changeWeek(1)">下一周 →</button>
<div class="q-theme" id="qTheme"></div>
<div class="q-zh" id="qZh"></div>
<div class="q-colloquial" id="qColloquial"></div>
<div class="q-en" id="qEn"></div>
<div class="q-divider"></div>
<div class="q-attr">
<div class="q-avatar" id="qAvatar"></div>
<div>
<div class="q-name" id="qName"></div>
<div class="q-title" id="qTitle"></div>
</div>
</div>
<div class="q-insight">
<div class="q-insight-label">对你的意义</div>
<div class="q-insight-text" id="qInsight"></div>
</div>
</div>
<div class="prog-wrap">
<div class="prog-bar-out"><div class="prog-bar-in" id="progBar"></div></div>
<div class="prog-text" id="progText"></div>
</div>
<div class="q-nav">
<button class="q-btn primary" onclick="goNow()">本周</button>
</div>
<div class="week-dots" id="weekDots"></div>
<div class="footer-line">每周一句 · 慢慢改变 · 长期复利</div>
</div>
</div>
<!-- ══ PANEL 2 ══ -->
<div class="panel" id="panel1">
<div class="p2-wrap">
<div class="p2-intro">
<div class="p2-title">本金与子弹</div>
<div class="p2-subtitle">Cash · Dry Powder · Expected Value · Capital Allocation</div>
</div>
<div class="p2-formula">
<div class="p2-formula-label">核心公式 · The Core Equation</div>
<div class="p2-formula-eq">
长期财富 = 本金安全 × 子弹效率 × 等待耐心
</div>
<div class="p2-formula-sub">
三项任何一项为零,结果归零。<br>
三项同时最大化,才能实现非对称的长期复利。
</div>
</div>
<!-- Section 1 -->
<div class="p2-section open" id="s0">
<div class="p2-section-header" onclick="toggleSection(0)">
<div class="p2-icon"></div>
<div>
<div class="p2-section-label">现金仓的本质</div>
<div class="p2-section-en">Cash is not zero. Cash is an option.</div>
</div>
<div class="p2-chevron">▶</div>
</div>
<div class="p2-body">
<div class="p2-law">
<div class="p2-law-num">01</div>
<div class="p2-law-content">
<div class="p2-law-title">现金不是零收益,是一张永不过期的期权</div>
<div class="p2-law-body">持有现金意味着你拥有在任意时刻、以任意价格买入任意资产的权利。这张期权没有行权成本,没有到期日,只有一个代价:你在等待期间的机会成本。</div>
<div class="p2-law-quote">"Cash combined with courage in a crisis is priceless." — Buffett</div>
<div class="p2-law-tag">期权价值理论</div>
</div>
</div>
<div class="p2-law">
<div class="p2-law-num">02</div>
<div class="p2-law-content">
<div class="p2-law-title">现金仓的三层结构</div>
<div class="p2-law-body">第一层:随时可用,应对闪崩(24小时内出手)。第二层:短期备用,应对政策/加息窗口(1~30天)。第三层:永久Dry Powder,永远不挂单,只为完全预料不到的事。三层不能混用。</div>
<div class="p2-law-tag">桥水资本 流动性分层框架</div>
</div>
</div>
<div class="p2-law">
<div class="p2-law-num">03</div>
<div class="p2-law-content">
<div class="p2-law-title">现金仓的最低红线:10%~15%</div>
<div class="p2-law-body">无论行情多好,永远保留10%~15%的现金仓不动。这不是保守,这是保证你在市场最极端时刻永远有出手能力。一旦子弹打完,你就从猎人变成了观众。</div>
<div class="p2-law-tag">仓位管理铁律</div>
</div>
</div>
</div>
</div>
<!-- Section 2 -->
<div class="p2-section" id="s1">
<div class="p2-section-header" onclick="toggleSection(1)">
<div class="p2-icon">🎯</div>
<div>
<div class="p2-section-label">机会成本</div>
<div class="p2-section-en">Opportunity Cost · Best Use of Capital</div>
</div>
<div class="p2-chevron">▶</div>
</div>
<div class="p2-body">
<div class="p2-law">
<div class="p2-law-num">01</div>
<div class="p2-law-content">
<div class="p2-law-title">每笔资金都有隐形成本</div>
<div class="p2-law-body">你把¥4,220挂在¥2.11,它的机会成本不是零,而是这笔钱在更高赔率机会(¥1.80)里能创造的收益。机会成本是真实的,即使它不出现在账单上。</div>
<div class="p2-law-quote">"The cost of something is what you give up to get it." — N. Gregory Mankiw</div>
<div class="p2-law-tag">经济学第一原理</div>
</div>
</div>
<div class="p2-law">
<div class="p2-law-num">02</div>
<div class="p2-law-content">
<div class="p2-law-title">资本配置优先级三问</div>
<div class="p2-law-body">在使用任何资金前,必须问:① 这是当前最高赔率的机会吗?② 赔率是否足够倾斜(向上空间 ÷ 向下空间 ≥ 2)?③ 使用这笔资金的机会成本是什么?三问全部通过,才动用资金。</div>
<div class="p2-law-tag">Capital Allocation Hierarchy</div>
</div>
</div>
<div class="p2-law">
<div class="p2-law-num">03</div>
<div class="p2-law-content">
<div class="p2-law-title">小机会是大机会的天敌</div>
<div class="p2-law-body">把子弹打在赔率普通的机会上(¥2.11),导致赔率极高的机会来临时(¥1.80)没有子弹——这才是现金仓管理最大的失误。不是持有太多现金,而是把子弹打在了错误的目标上。</div>
<div class="p2-law-tag">Druckenmiller 重仓原则</div>
</div>
</div>
</div>
</div>
<!-- Section 3 -->
<div class="p2-section" id="s2">
<div class="p2-section-header" onclick="toggleSection(2)">
<div class="p2-icon">📐</div>
<div>
<div class="p2-section-label">期望值管理</div>
<div class="p2-section-en">Expected Value · Kelly Criterion</div>
</div>
<div class="p2-chevron">▶</div>
</div>
<div class="p2-body">
<div class="p2-law">
<div class="p2-law-num">01</div>
<div class="p2-law-content">
<div class="p2-law-title">期望值公式</div>
<div class="p2-law-body">期望值 = 胜率 × 盈利幅度 − 败率 × 亏损幅度。只有期望值为正,且足够高,才值得出手。赔率不够时,期望值可能为正但极小——凯利公式会告诉你最优仓位接近零。</div>
<div class="p2-law-quote">"It's not whether you're right or wrong, but how much you make when right and lose when wrong." — Soros</div>
<div class="p2-law-tag">Kelly Criterion · 1956 Bell Labs</div>
</div>
</div>
<div class="p2-law">
<div class="p2-law-num">02</div>
<div class="p2-law-content">
<div class="p2-law-title">管理的是系统,不是单笔</div>
<div class="p2-law-body">一次踏空(没买到¥2.11)不影响系统期望值。重要的是:每次决策是否符合框架?框架的长期期望值是否为正?单次结果是随机的,系统的期望值才是真实的。</div>
<div class="p2-law-tag">Annie Duke · Resulting 谬误</div>
</div>
</div>
<div class="p2-law">
<div class="p2-law-num">03</div>
<div class="p2-law-content">
<div class="p2-law-title">频繁交易是期望值的侵蚀剂</div>
<div class="p2-law-body">在震荡市里+3%/+5%来回做,手续费+摩擦成本+机会成本加总后,实际收益趋近于零。凯利公式在低赔率情景下的答案是:仓位接近零。不做,有时候是最高期望值的选择。</div>
<div class="p2-law-tag">均值回归陷阱</div>
</div>
</div>
</div>
</div>
<!-- Section 4 -->
<div class="p2-section" id="s3">
<div class="p2-section-header" onclick="toggleSection(3)">
<div class="p2-icon">🔫</div>
<div>
<div class="p2-section-label">子弹纪律</div>
<div class="p2-section-en">Dry Powder Discipline · Conviction Sizing</div>
</div>
<div class="p2-chevron">▶</div>
</div>
<div class="p2-body">
<div class="p2-law">
<div class="p2-law-num">01</div>
<div class="p2-law-content">
<div class="p2-law-title">子弹的三种错误死法</div>
<div class="p2-law-body">太早打完:市场跌5%全仓,跌15%的真正机会来了没子弹。永远不打:等到跌40%才敢买,市场只跌30%就反弹。③打在错误目标:赔率普通的机会消耗了赔率极高时需要的子弹。你的问题主要是③。</div>
<div class="p2-law-tag">子弹消耗失误分类</div>
</div>
</div>
<div class="p2-law">
<div class="p2-law-num">02</div>
<div class="p2-law-content">
<div class="p2-law-title">高确信度时重仓,这是职业和业余的分水岭</div>
<div class="p2-law-body">把最多的子弹压在最高确信度的区间。你的日经52,000~54,000、标普5,700~6,000是高确信区,理应是最大注。哨兵档的子弹越少越好,主仓档的子弹越多越好。</div>
<div class="p2-law-quote">"The best investment you can make is one where you risk a little to make a lot." — Druckenmiller</div>
<div class="p2-law-tag">Conviction Sizing · 集中押注原则</div>
</div>
</div>
<div class="p2-law">
<div class="p2-law-num">03</div>
<div class="p2-law-content">
<div class="p2-law-title">买入标准:必要条件 vs 充分条件</div>
<div class="p2-law-body">必要条件:价格合理(如溢价消失)。充分条件:价格合理 且 赔率足够高 且 这是当前资本最优配置。你的卖出系统(阶梯止盈)是充分条件设计。你的买入系统需要同样的严格标准。</div>
<div class="p2-law-tag">买入充分条件框架</div>
</div>
</div>
</div>
</div>
<!-- Section 5 -->
<div class="p2-section" id="s4">
<div class="p2-section-header" onclick="toggleSection(4)">
<div class="p2-icon"></div>
<div>
<div class="p2-section-label">市场状态过滤器</div>
<div class="p2-section-en">Market Regime Filter · Big Picture First</div>
</div>
<div class="p2-chevron">▶</div>
</div>
<div class="p2-body">
<div class="p2-law">
<div class="p2-law-num">01</div>
<div class="p2-law-content">
<div class="p2-law-title">大盘是所有ETF的公因子</div>
<div class="p2-law-body">大盘不好,整个板块都不好。在做个股/ETF决策之前,先判断市场整体处于什么状态。大盘是流动性和情绪的晴雨表,是第一道过滤开关,不是预测工具。</div>
<div class="p2-law-tag">Market Regime Filter · 桥水 / AQR</div>
</div>
</div>
<div class="p2-law">
<div class="p2-law-num">02</div>
<div class="p2-law-content">
<div class="p2-law-title">沪深300四档状态机</div>
<div class="p2-law-body">4,000点以上:正常,不追加仓位。3,500~4,000:警戒,准备子弹开始挂单。3,200~3,500:恐慌,第一批子弹触发。3,200以下:极端,主仓子弹全部出动。大盘状态决定整体仓位上限。</div>
<div class="p2-law-tag">你自己悟出的 Regime Filter</div>
</div>
</div>
<div class="p2-law">
<div class="p2-law-num">03</div>
<div class="p2-law-content">
<div class="p2-law-title">预期值不是绝对,是开关</div>
<div class="p2-law-body">不需要知道最低点在哪里。只需要知道"现在的市场状态允不允许我动手"。大盘过滤器把不可知的(精确低点)转化为可判断的(状态档位),这是系统从感性走向理性的关键一步。</div>
<div class="p2-law-tag">你的原话,华尔街叫 Regime Filter</div>
</div>
</div>
</div>
</div>
<div class="footer-line" style="margin-top:20px">本金是前提 · 子弹是工具 · 纪律是护城河</div>
</div>
</div>
<script>
// ── QUOTES DATA ──
const quotes = [
{ theme:"等待 · Patience", en:"The stock market is a device for transferring money from the impatient to the patient.", zh:"股票市场是一台把钱从没耐心的人手里转移到有耐心的人手里的机器(大白话:股市本质就是财富搬运机:把急躁散户的钱,转给耐得住的投资者)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"你设了挂单,然后等待。大多数人等不住,在最低点前割肉。你的耐心,本身就是你的优势。" },
{ theme:"纪律 · Discipline", en:"The few times I've been most certain, I've been most wrong.", zh:"越是笃定行情稳赚不赔的时候,往往越容易出现重大亏损(大白话:越觉得稳赢满仓梭哈,越容易踩大坑大亏)", name:"Stanley Druckenmiller", title:"杜肯家族办公室 创始人", avatar:"D", insight:"感觉最确定的时候,恰恰需要最谨慎。条件单的价值,是在你最亢奋时阻止你追高。" },
{ theme:"止盈 · Taking Profits", en:"No one ever went broke taking profits.", zh:"从来没有人因为及时止盈落袋最终破产(大白话:止盈永远不会亏到破产,贪到底才容易坐过山车由盈转亏)", name:"Bernard Baruch", title:"华尔街传奇投机者", avatar:"B", insight:"你的阶梯止盈系统,正是这句话的执行版本。止盈是确定性的胜利,不是胆怯。" },
{ theme:"现金仓 · Dry Powder", en:"Cash combined with courage in a crisis is priceless.", zh:"市场大跌危机中,手握现金再加敢于布局的胆识是无价之宝(大白话:熊市手里有闲钱、敢低位加仓,就是最硬的底牌)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"你的Dry Powder不是闲置,是在等待危机。危机来临时,有子弹的人是猎人,没子弹的人是猎物。" },
{ theme:"遗憾 · Regret", en:"The biggest mistake is not having a rule at all. Selling too early is the cost of sleeping well.", zh:"投资最大的错误是没有任何交易纪律,过早卖出只是换取安稳睡眠的合理成本(大白话:炒股最怕毫无规矩乱操作,卖早少赚点,但能睡踏实不焦虑)", name:"Peter Lynch", title:"富达麦哲伦基金 前基金经理", avatar:"L", insight:"你每一次提前止盈的遗憾,换来的是确定性。在充满不确定性的市场里,确定性本身有价值。" },
{ theme:"系统 · System", en:"I have two rules. Rule 1: Never lose money. Rule 2: Never forget Rule 1.", zh:"我有两条投资铁律:第一条永远不要亏损本金;第二条牢记第一条规则(大白话:守好本金是第一要务,时时刻刻不能忘)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"仓位上限、止损框架、Dry Powder——你的每一道规则,都是在保护本金不受永久性损失。" },
{ theme:"重仓 · Conviction", en:"Diversification is protection against ignorance. It makes little sense if you know what you are doing.", zh:"分散投资是对认知不足的风险对冲,当你吃透标的后,过度分散没有意义(大白话:看不懂才靠分散保命,研究透彻后分散反而稀释收益)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"你把主仓压在日经52,000~54,000、标普5,700~6,000,不是分散不够,是对高确信区间的集中押注。" },
{ theme:"非对称 · Asymmetry", en:"The best investment you can make is one where you risk a little to make a lot.", zh:"优质投资是用小幅可控风险,去博取长期丰厚收益(大白话:好机会就是亏有限、赚空间巨大的布局)", name:"George Soros", title:"量子基金 创始人", avatar:"S", insight:"你的伏击策略本质上是非对称收益——现价不动子弹归零,跌到位满仓获利翻倍。这就是最好的投资结构。" },
{ theme:"决策质量 · Process", en:"A good decision can have a bad outcome. A bad decision can have a good outcome. Outcomes cannot judge decision quality.", zh:"正确的决策短期也可能亏损,错误的决策靠运气也能盈利,单次盈亏无法评判决策好坏(大白话:一次赚钱不代表思路对,一次被套不代表策略失效)", name:"Annie Duke", title:"扑克世界冠军 / 决策科学家", avatar:"D", insight:"¥2.11没买、它涨上去了——这是好决策的坏结果。用结果评价决策是陷阱,用框架评价决策才是正道。" },
{ theme:"复利 · Compounding", en:"The first rule of compounding: never interrupt it unnecessarily.", zh:"复利第一准则:不要毫无缘由随意打断盈利复利滚动(大白话:盈利拿住别频繁止盈清仓,轻易中断复利等于丢大钱)", name:"Charlie Munger", title:"伯克希尔·哈撒韦 副主席", avatar:"M", insight:"你的系统每次完整执行——买入、止盈、回补——就是在让复利运转。打断它的,往往是情绪,不是理性。" },
{ theme:"市场先生 · Mr. Market", en:"Mr. Market is your servant, not your guide.", zh:"市场先生是为你服务的仆人,不是指引你买卖的向导(大白话:涨跌波动帮你捡低价筹码,别跟着行情涨跌追涨杀跌)", name:"Benjamin Graham", title:"价值投资之父", avatar:"G", insight:"市场跌到你的挂单价,它是在为你服务。市场飙升让你追高,它是在误导你。你的条件单,让你永远是主人。" },
{ theme:"情绪管理 · Emotion", en:"Once you have ordinary intelligence, what you need is the temperament to control the urges that get other people into trouble.", zh:"投资不需要绝顶智商,关键是拥有克制情绪化操作的心态(大白话:智商够用就行,管住追涨割肉的冲动才是赢钱关键)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"你用条件单管住了冲动。这比任何分析技巧都重要。气质,才是散户和机构真正的分水岭。" },
{ theme:"等待机会 · Selectivity", en:"I only swing at pitches in my sweet spot.", zh:"我只在自己熟悉的优势区间出手布局(大白话:看不懂的行情一概不碰,只在自己的低估舒适区建仓)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"放弃¥2.11,等待¥1.80,就是在等甜蜜区的球。不是每个球都值得挥棒。" },
{ theme:"宏观判断 · Macro", en:"When I see a pile of money in the corner, I just go pick it up.", zh:"当市场出现明显低估的捡钱机会,果断进场布局即可(大白话:跌到明确价值底不用犹豫,分批捡筹码)", name:"Stanley Druckenmiller", title:"杜肯家族办公室 创始人", avatar:"D", insight:"你的套息平仓逻辑、中期选举统计——都是在寻找那堆角落里的钱。不是每次都有,但一旦找到,重仓。" },
{ theme:"风险管理 · Risk", en:"Rule No. 1 of risk management: survive to fight another day.", zh:"风险管理第一条准则:先保证账户存活,保留后续再战的本金(大白话:风控优先活下来,留得本金在不怕没行情)", name:"Ray Dalio", title:"桥水基金 创始人", avatar:"D", insight:"你的仓位上限——标普¥8万、纳指¥5万、日经¥3.5万——不是胆小,是确保你永远有机会再战。" },
{ theme:"黑天鹅 · Black Swan", en:"Prepare for the expected. But also prepare for the unexpected.", zh:"既要做好常规行情的预案,也要预留资金应对突发意外风险(大白话:常规下跌要防,黑天鹅暴跌也要留后手仓位)", name:"Nassim Taleb", title:"《黑天鹅》作者", avatar:"T", insight:"你的C档极端伏击价——日经45,000、标普4,800——就是为意外做的准备。大多数时候用不到,用到了是奇袭。" },
{ theme:"执行力 · Execution", en:"It's not what you know that makes you rich. It's what you do.", zh:"让人盈利的不是掌握多少投资道理,而是严格落地执行策略(大白话:懂再多没用,按规则实操才能落袋赚钱)", name:"Paul Tudor Jones", title:"都铎投资 创始人", avatar:"J", insight:"你知道套息逻辑,你知道选举统计,但让这些知识变成收益的,是你3月23日那天按下买入键。" },
{ theme:"本金保护 · Capital Preservation", en:"The most important thing about making money is not to let the losses get out of hand.", zh:"盈利的核心关键,是避免亏损持续失控放大(大白话:小亏不止损,最后容易深度套牢大亏)", name:"George Soros", title:"量子基金 创始人", avatar:"S", insight:"你的仓位上限、分档买入、Dry Powder,构成了一套完整的亏损防火墙。这是系统最重要的设计。" },
{ theme:"长期主义 · Long Term", en:"In the short run, the market is a voting machine. In the long run, it is a weighing machine.", zh:"短期市场是情绪化投票器,长期市场是价值称重器(大白话:短线涨跌看散户情绪,长线涨跌靠公司内在价值)", name:"Benjamin Graham", title:"价值投资之父", avatar:"G", insight:"你的伏击策略是长期主义的——不管短期怎么投票,只要资产真实价值在,称重机终会还原真相。" },
{ theme:"逆向思维 · Contrarian", en:"Be fearful when others are greedy, and greedy when others are fearful.", zh:"别人疯狂贪婪追涨时保持谨慎,市场集体恐慌割肉时逐步布局(大白话:全民狂热要收手,遍地恐慌敢捡筹)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"你的条件单在市场最恐慌时自动触发。这不是勇气——这是你在平静时做的决策,在恐慌中自动执行。" },
{ theme:"期望值 · Expected Value", en:"In investing, what is comfortable is rarely profitable.", zh:"投资里操作起来顺手舒服的选择,往往很难赚到钱(大白话:追涨买在高位最舒服,最后大多被套亏钱)", name:"Robert Arnott", title:"Research Affiliates 创始人", avatar:"A", insight:"3月23日大跌时买入,是痛苦的,不舒适的。正因为不舒适,大多数人不做,所以才有超额回报。" },
{ theme:"复利 · Eighth Wonder", en:"Compound interest is the eighth wonder of the world. He who understands it, earns it.", zh:"复利是世界第八大奇迹,吃透复利规律的人能从中获利(大白话:懂复利慢慢滚资产,不懂的白白错过财富增长)", name:"Einstein(被引用)", title:"被华尔街广泛引用", avatar:"E", insight:"你的阶梯止盈后立即设回补单,本质上是在让资金循环复利——每一次完整的买卖循环,都是复利的一次迭代。" },
{ theme:"自我认知 · Know Your Holdings", en:"Know what you own, and know why you own it.", zh:"清楚自己持仓的品种,同时明确买入的逻辑理由(大白话:每只持仓都要讲得出买入逻辑,杜绝无脑跟风买入)", name:"Peter Lynch", title:"富达麦哲伦基金 前基金经理", avatar:"L", insight:"你的每一笔挂单都有书面理由。这不是形式,这是确保你在市场震荡时,知道自己为什么在这里。" },
{ theme:"时间 · Time in Market", en:"Time in the market beats timing the market.", zh:"长期留在市场持仓,胜过频繁预判高低点择时(大白话:拿着等行情,远比天天猜顶摸底靠谱)", name:"Ken Fisher", title:"费雪投资 创始人", avatar:"F", insight:"你的系统不预测高低点,而是在足够低的区间分批建仓。这比试图精确抄底,更可执行,更有效。" },
{ theme:"凯利公式 · Kelly", en:"Bet big when the odds are in your favor. Bet small when they're not. Don't bet at all when you can't tell.", zh:"赔率占优时重仓布局,赔率不明时小仓试错,完全看不懂就空仓观望(大白话:划算机会重仓,模糊机会轻仓,看不懂直接不进场)", name:"Edward Thorp", title:"《击败庄家》作者 / 量化投资先驱", avatar:"T", insight:"凯利公式的精髓。你放弃¥2.11(赔率普通),保留资金等¥1.80(赔率高),这就是凯利在实战中的应用。" },
{ theme:"宏观过滤 · Don't Fight", en:"Don't fight the Fed. Don't fight the tape.", zh:"不要逆着货币政策操作,不要和中长期大趋势反向博弈(大白话:政策收紧别硬做多,大趋势向下别逆势抄底)", name:"Martin Zweig", title:"华尔街传奇分析师", avatar:"Z", insight:"你的大盘过滤器想法——用沪深300点位设买入开关——正是这句话的执行版本。宏观环境是第一道关卡。" },
{ theme:"独立思考 · Independence", en:"You are neither right nor wrong because the crowd disagrees with you.", zh:"持仓对错和大众观点无关,由背后的数据与逻辑决定(大白话:散户都反对不代表你错,逻辑数据过硬才是硬道理)", name:"Benjamin Graham", title:"价值投资之父", avatar:"G", insight:"在大跌时买入,所有人都说你疯了。但你的数据(历史支撑位)和推理(套息逻辑)是对的。" },
{ theme:"幸存者偏差 · Survivorship", en:"The market is filled with individuals who know the price of everything, but the value of nothing.", zh:"市场里多数人只紧盯股价涨跌,却无视资产本身内在价值(大白话:天天盯涨跌价位,从来不研究标的值不值钱)", name:"Philip Fisher", title:"成长股投资之父", avatar:"F", insight:"那个大V说全年空仓只做两三次——他告诉你的是价格,不是价值,也不是他的完整决策框架。" },
{ theme:"简单 · Simplicity", en:"Investing is simple, but not easy.", zh:"投资的道理通俗易懂,但是落地执行十分艰难(大白话:低买高卖人人会说,克服人性做到的寥寥无几)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"你的系统很简单:条件单、分档建仓、阶梯止盈。但执行它——在恐慌中不割肉,在亢奋中不追高——不容易。" },
{ theme:"适应性 · Adaptability", en:"It's not the strongest species that survives, nor the most intelligent. It's the one most responsive to change.", zh:"存活下来的不是最强壮的,也不是最聪明的,而是最能适应变化的。(大白话:股市里没有常胜将军,能活下来的不是最猛的那个,而是懂得顺势应变的人)", name:"Darwin(被引用)", title:"进化论之父", avatar:"D", insight:"你的策略从网格到选举策略到止盈框架,三次演变,每次有据可查。这种适应性,是长期存活的关键。" },
{ theme:"非对称收益 · Payoff", en:"I'm always thinking about losing money rather than making money.", zh:"我总在想怎么不亏钱,而不是怎么赚钱。(大白话:天天琢磨怎么赚钱容易踩坑,先想好怎么不亏钱才是正经事)", name:"Paul Tudor Jones", title:"都铎投资 创始人", avatar:"J", insight:"先想最坏情景——如果全部挂单触发后继续下跌怎么办——再决定仓位。这是反直觉但正确的思维顺序。" },
{ theme:"集中 · Concentration", en:"Wide diversification is only required when investors do not understand what they are doing.", zh:"只有投资者看不懂投资标的时,才需要大范围分散持仓(大白话:外行才遍地撒网乱买,内行精选少数标的集中布局)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"你把大量资金集中在日经52,000~54,000,标普5,700~6,000——这不是分散不够,是对高确信区间的正确集中。" },
{ theme:"机会成本 · Option Value", en:"The opportunity cost of holding cash is real, but so is the option value of waiting.", zh:"持有现金的机会成本是真实的,但等待的期权价值也是真实的。(大白话:空仓看别人涨确实难受,但耐心等确定性机会的潜在回报同样真实)", name:"Howard Marks", title:"橡树资本 创始人", avatar:"M", insight:"¥4,220放在¥2.11是机会成本;放在账户等¥1.80是期权价值。两者都真实,但后者在这个时刻更高。" },
{ theme:"周期 · Cycles", en:"The four most dangerous words in investing are: 'this time it's different.'", zh:"投资中最危险的四个字是:这次不一样。(大白话:每次牛市都有人喊这次不一样,结果发现该来的调整一个都不会少)", name:"John Templeton", title:"邓普顿基金 创始人", avatar:"T", insight:"套息崩塌、加息打压估值、选举年震荡——这些都不是第一次发生。历史会重演,不完全一样,但足够相似。" },
{ theme:"耐心 · The Long Game", en:"The stock market is designed to transfer money from the active to the patient.", zh:"股票市场是一台把钱从没耐心的人手里转移到有耐心的人手里的机器(大白话:股市本质就是财富搬运机:把急躁散户的钱,转给耐得住的投资者)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"你的条件单让你从活跃变成耐心。设好单,然后什么都不做——这是最难的操作,也是最有价值的操作。" },
{ theme:"概率思维 · Probability", en:"In the short run, results are dominated by randomness. In the long run, skill wins.", zh:"短期收益由随机行情主导,拉长周期专业能力终将兑现盈利(大白话:单次盈亏靠运气,长年赚钱靠成熟交易系统)", name:"Michael Mauboussin", title:"哥伦比亚商学院教授", avatar:"M", insight:"¥2.11没买到然后涨上去了——这是随机性。你的系统长期执行下去,能力会在足够多次后显现。" },
{ theme:"错误管理 · Managing Mistakes", en:"The most important thing is not to be right, but to make money when you are right.", zh:"最重要的不是要正确,而是正确时赚大钱,错误时少亏钱。(大白话:预测对错不重要,关键是对了要重仓赚足,错了要轻仓少亏)", name:"George Soros", title:"量子基金 创始人", avatar:"S", insight:"你的非对称设计:最坏情景子弹空置损失机会成本,最好情景满仓在底部获利翻倍。错误成本远小于正确收益。" },
{ theme:"记录 · Journaling", en:"Write down your reasons for every investment before you make it.", zh:"在每次投资前写下你的理由。如果你说不清楚,你可能不应该做。(大白话:动手买之前写清楚买入逻辑,讲不明白就别碰)", name:"Peter Lynch", title:"富达麦哲伦基金 前基金经理", avatar:"L", insight:"你的投资日志不是记录,是决策过滤器。每次写下理由,就是在强迫自己确认逻辑是否站得住脚。" },
{ theme:"市场情绪 · Sentiment", en:"Markets are constantly in a state of uncertainty and flux. Money is made by discounting the obvious.", zh:"市场永远处于不确定和波动中。钱是通过忽视显而易见、押注意外来赚的。(大白话:赚钱的机会藏在没人看好的角落里,跟风追热门注定赚不到大钱)", name:"George Soros", title:"量子基金 创始人", avatar:"S", insight:"大跌时人人恐慌,那是显而易见的情绪。你的条件单在那时自动买入,押注的是意外的反弹。" },
{ theme:"人性 · Human Nature", en:"The investor's chief problem — and even his worst enemy — is likely to be himself.", zh:"投资者最大的问题——甚至是最大的敌人——很可能是他自己。(大白话:炒股最大的敌人不是庄家也不是市场,而是自己的贪婪和恐惧)", name:"Benjamin Graham", title:"价值投资之父", avatar:"G", insight:"你用条件单把自己锁在决策链之外。这不是放弃控制权,这是把决策权交给更清醒的自己——设单时的你。" },
{ theme:"价值 · Price vs Value", en:"Price is what you pay. Value is what you get.", zh:"价格是你付出的成本,价值是你实际拿到的内在资产(大白话:你掏真金白银买的是股价,真正赚到靠的是公司本身价值)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"160644在¥2.11,价格合理了,但价值没有变。价值等于净值,溢价是情绪,不是价值。买价值,不买情绪。" },
{ theme:"专注 · Saying No", en:"Really successful people say no to almost everything.", zh:"真正成功者对几乎所有事说不。(大白话:高手不是机会多,而是大多数机会都舍得放掉,只抓最有把握的)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"你放弃了¥2.11,说不。你有足够多的机会在等待——只做最高赔率的,忽略其他。这是真正的选择。" },
{ theme:"信念 · Conviction Sizing", en:"You need to have a big position in things when you have a huge edge.", zh:"当你有巨大优势时,要下大注。(大白话:没把握就小仓试错,有把握要敢于重仓,看对了不敢下注等于白看)", name:"Stanley Druckenmiller", title:"杜肯家族办公室 创始人", avatar:"D", insight:"你把主仓压在日经52,000~54,000、标普5,700~6,000。这两个区间是你的巨大优势区,应该是最大注。" },
{ theme:"学习 · Continuous Learning", en:"The more you learn, the more you earn.", zh:"学得越多,赚得越多。(大白话:投资认知每上一个台阶,赚钱能力就跟着长一截)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"从网格到选举策略,从单一挂单到资本配置优先级,你的系统在进化。每一次迭代,都是学习的复利。" },
{ theme:"现实主义 · No Forecasting", en:"Forecasts may tell you a great deal about the forecaster; they tell you nothing about the future.", zh:"预测告诉你很多关于预测者的事;对未来,它什么都说不了。(大白话:别信那些拍胸脯预测涨跌的,没人能看透未来,做好预案比猜方向靠谱)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"没有人知道日经什么时候跌到45,000,标普什么时候跌到5,700。不预测,只准备。这才是可执行的系统。" },
{ theme:"坚持 · Temperament", en:"The most important quality for an investor is temperament, not intellect.", zh:"投资者最重要的品质是气质,不是智力。(大白话:高智商不一定赚钱,跌了不慌、涨了不飘、空仓不急,这心态才是真本事)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"你在大跌时不割肉,在亢奋时不追高,在遗憾时不降低标准——这种气质,比任何分析能力都稀有。" },
{ theme:"系统思维 · Buy the Haystack", en:"Don't look for the needle in the haystack. Just buy the haystack.", zh:"不要在草堆里找针。把整个草堆买下来。(大白话:选股不如买指数,费劲挑半天还不如直接买整个市场省心赚钱)", name:"John Bogle", title:"先锋集团 创始人", avatar:"B", insight:"你的ETF组合——标普、纳指、日经——正是这个思路。买整个市场,让时间和分散做工作。" },
{ theme:"贪婪与恐惧 · Greed & Fear", en:"Try to be greedy when others are fearful. And try to be fearful when others are greedy.", zh:"别人贪婪狂热时保持谨慎,只有市场集体恐慌时才主动布局(大白话:全民追涨我收手,市场恐慌我分批进场)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"现在标普、纳指都在历史新高——这是别人贪婪的时刻。你把子弹留着,等别人恐惧时用。" },
{ theme:"过程 · Process Over Outcome", en:"A good process consistently applied will produce good outcomes over time.", zh:"一个持续执行的好过程,长期来看会产生好结果,即使单次结果有好有坏。(大白话:别在意一两次盈亏,坚持把交易流程走对,长期自然赚钱)", name:"Howard Marks", title:"橡树资本 创始人", avatar:"M", insight:"你的日志、条件单、分档系统——这是好过程。单次结果(某笔踏空或止盈早了)不影响过程的长期价值。" },
{ theme:"时间 · Plant a Tree", en:"Someone is sitting in the shade today because someone planted a tree a long time ago.", zh:"今天有人坐在树荫下,是因为很久以前有人种了一棵树。(大白话:现在赚的每一分钱,都是以前做对的布局结的果)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"你今天设的每一张条件单,是在种树。也许三个月后触发,也许两年后触发。但树一直在生长。" },
{ theme:"改变 · Habit Formation", en:"The chains of habit are too light to be felt until they are too heavy to be broken.", zh:"习惯的锁链太轻,轻到感觉不到;直到它变得太重,重到无法打破。(大白话:坏习惯刚养成时觉得没什么,等发现改不掉时已经亏了大钱)", name:"Buffett引用Samuel Johnson", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"每周一句金句,是在建立投资认知的习惯。现在感觉轻——只是读一句话。一年后,它会成为你思维的一部分。" },
{ theme:"慢慢变富 · Slowly Rich", en:"Nobody wants to get rich slowly.", zh:"没有人愿意慢慢变富。(大白话:都想一夜暴富不愿慢慢攒,但股市里赚快钱的人最后都还回去了)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"你在做别人不愿意做的事——等待、忍耐、接受遗憾。这种反人性的坚持,就是超额回报的来源。" },
{ theme:"终章 · The Long Arc", en:"Our favorite holding period is forever.", zh:"我们最喜欢的持有期限是:永远。(大白话:好资产拿得住才是真本事,别总想着高抛低吸折腾)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"52周走完了。回头看——你的认知变了吗?你的决策框架更清晰了吗?如果是,这52句话做到了它该做的事。" },
];
// ── LOCAL STORAGE ──
const STORAGE_KEY = 'wallstreet-wisdom-state';
function loadState() {
try {
const raw = localStorage.getItem(STORAGE_KEY);
if (raw) {
const state = JSON.parse(raw);
if (state && typeof state.week === 'number') {
cw = Math.max(0, Math.min(51, state.week));
if (Array.isArray(state.visited)) {
state.visited.forEach(v => visited.add(v));
}
renderQuote();
return;
}
}
} catch {}
// no saved state — default to current week
goNow();
}
function saveState() {
try {
localStorage.setItem(STORAGE_KEY, JSON.stringify({
week: cw,
visited: Array.from(visited)
}));
} catch {}
}
// ── TAB SWITCHING ──
function switchTab(idx, btn) {
document.querySelectorAll('.tab-btn').forEach((b,i) => b.classList.toggle('active', i===idx));
document.querySelectorAll('.panel').forEach((p,i) => p.classList.toggle('active', i===idx));
}
// ── QUOTE LOGIC ──
function getCurrentWeek() {
const start = new Date('2026-06-05');
const today = new Date();
const diff = Math.floor((today - start) / 86400000);
return Math.max(0, Math.min(Math.floor(diff/7), 51));
}
let cw = 0;
const visited = new Set();
function renderQuote() {
const q = quotes[cw];
document.getElementById('weekNum').textContent = `WEEK ${cw+1}`;
document.getElementById('qTheme').textContent = q.theme;
document.getElementById('qEn').textContent = `"${q.en}"`;
const zhFull = q.zh;
const parenIdx = zhFull.indexOf('(');
if (parenIdx > -1) {
document.getElementById('qZh').textContent = zhFull.substring(0, parenIdx);
document.getElementById('qColloquial').textContent = zhFull.substring(parenIdx);
} else {
document.getElementById('qZh').textContent = zhFull;
document.getElementById('qColloquial').textContent = '';
}
document.getElementById('qAvatar').textContent = q.avatar;
document.getElementById('qName').textContent = q.name;
document.getElementById('qTitle').textContent = q.title;
document.getElementById('qInsight').textContent = q.insight;
document.getElementById('progBar').style.width = `${((cw+1)/52)*100}%`;
document.getElementById('progText').textContent = `${cw+1} / 52 weeks`;
document.getElementById('prevBtn').disabled = cw===0;
document.getElementById('nextBtn').disabled = cw===51;
const card = document.getElementById('quoteCard');
card.style.animation='none';
setTimeout(()=>card.style.animation='cardIn 0.6s ease forwards',10);
renderDots();
}
function renderDots() {
const c = document.getElementById('weekDots'); c.innerHTML='';
quotes.forEach((_,i)=>{
const d=document.createElement('div');
d.className='dot'+(i===cw?' active':visited.has(i)?' visited':'');
d.title=`Week ${i+1}`;
d.onclick=()=>{cw=i;visited.add(i);renderQuote();saveState();};
c.appendChild(d);
});
}
function changeWeek(d){ cw=Math.max(0,Math.min(51,cw+d)); visited.add(cw); renderQuote(); saveState(); }
function goNow(){ cw=getCurrentWeek(); visited.add(cw); renderQuote(); saveState(); }
// ── ACCORDION ──
function toggleSection(idx) {
const s = document.getElementById('s'+idx);
s.classList.toggle('open');
}
// ── INIT ──
loadState();
</script>
</body>
</html>
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,15 @@
{
"_comment": "OSS 文件柜前端鉴权配置",
"enable_auth_comment": "true: 启用三层鉴权(cookie/GUID/token); false: 完全放开访问",
"enable_auth": true,
"max_age_days_comment": "鉴权 cookie 最大有效天数(1~365),过期后需重新获取入口授权",
"max_age_days": 30,
"cookieName_comment": "鉴权 Cookie 名称(gate 外层 cookie,不等于业务登录态)",
"cookieName": "oss_file_cabinet_gate",
"requireGuid_comment": "true:入口必须带 guid 参数,否则直接拒绝;false:允许仅凭 token 或已有会话访问",
"requireGuid": true,
"guidParam_comment": "URL 中的 GUID 参数名,建议使用小写 guid",
"guidParam": "guid",
"guidValue_comment": "GUID 参数值,建议使用高强度随机长串并定期更换,不在前端硬编码",
"guidValue": "db8a_2f1c-90e7-45a-a(d2-c3e4f50890"
}
+15
View File
@@ -0,0 +1,15 @@
{
"_comment": "绿植的流浪家园工具的前端鉴权配置",
"enable_auth_comment": "true:启用鉴权(需要从导航登录);false:完全放开访问流浪家园工具",
"enable_auth": true,
"max_age_days_comment": "鉴权 cookie 的最大有效天数(1~365)",
"max_age_days": 30,
"cookieName_comment": "鉴权 Cookie 名称,建议保持默认",
"cookieName": "plant_home_gate",
"requireGuid_comment": "true:入口必须带 guid 参数;false:允许仅凭 token 或会话访问",
"requireGuid": true,
"guidParam_comment": "URL 中的 GUID 参数名,建议使用小写 guid",
"guidParam": "guid",
"guidValue_comment": "GUID 参数值,建议使用高强度随机长串并定期更换",
"guidValue": "ALSKDJF-ASJDF3108KSJD-KSA754DJFO-IJWOE23IFKNF45KJF5JK"
}
@@ -0,0 +1,15 @@
{
"_comment": "私人剪贴板工具的前端鉴权配置",
"enable_auth_comment": "true:启用鉴权;false:关闭鉴权并放开访问",
"enable_auth": true,
"max_age_days_comment": "鉴权 Cookie 有效期(天),1天后过期需重新登录",
"max_age_days": 1,
"cookieName_comment": "鉴权 Cookie 名称,建议保持默认",
"cookieName": "private_clipboard_gate",
"requireGuid_comment": "true:入口必须带 guid 参数;false:允许仅凭 token 或会话访问",
"requireGuid": true,
"guidParam_comment": "URL 中的 GUID 参数名,建议使用小写 guid",
"guidParam": "guid",
"guidValue_comment": "GUID 参数值,建议使用高强度随机长串并定期更换",
"guidValue": "db8a2f1c-90e7-4b5a-a1d2-c3e4f5067890"
}
+9
View File
@@ -0,0 +1,9 @@
{
"_comment": "PSC 工具(密码安全中心等)的前端鉴权配置",
"enableCookieAuth_comment": "true:启用基于 JWT cookie 的鉴权;false:关闭(通常仅限开发环境)",
"enableCookieAuth": false,
"cookieName_comment": "PSC 使用的 JWT cookie 名称",
"cookieName": "TRAE-PSC_jwt",
"max_age_days_comment": "JWT cookie 的最大有效天数(1~365)",
"max_age_days": 30
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 217 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 205 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 342 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 KiB

+41
View File
@@ -0,0 +1,41 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Yang's 网盘</title>
<link rel="icon" href="psc.svg" type="image/svg+xml" />
<style>
body{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif;margin:0;padding:0;color:#111}
.container{max-width:800px;margin:24px auto;padding:0 16px}
h1{font-size:24px;margin:0 0 12px}
#statusTop{color:#666;margin-bottom:16px}
input{padding:8px;border:1px solid #ccc;border-radius:4px}
button{padding:8px 12px;border:1px solid #999;border-radius:4px;background:#f7f7f7}
.debugbox{white-space:pre-wrap;border:1px dashed #ccc;border-radius:4px;padding:8px;min-height:120px;margin-top:8px;color:#333}
</style>
<script>
let lines=[]
function log(){ const t=new Date().toISOString(); const msg=[t].concat([].slice.call(arguments)).join(' '); lines.push(msg); if(lines.length>200) lines.shift(); const el=document.getElementById('debugBottom'); if(el) el.textContent=lines.join('\n') }
function setStatus(t){ const s=document.getElementById('status'); if(s) s.textContent=t; const top=document.getElementById('statusTop'); if(top) top.textContent='后端: ' + location.origin + ' | ' + t; try{ log('status', t) }catch{} }
async function calcMasterFp(s){ const material = await window.crypto.subtle.importKey('raw', new TextEncoder().encode(s), 'PBKDF2', false, ['deriveBits']); const bits = await window.crypto.subtle.deriveBits({ name:'PBKDF2', hash:'SHA-256', salt: new TextEncoder().encode('local-fp'), iterations:120000 }, material, 256); const b = new Uint8Array(bits); return btoa(String.fromCharCode(...b)) }
function init(){ log('app.loaded'); log('backend.origin', location.origin); log('initUi.start'); const btn=document.getElementById('btnLogin'); const inp=document.getElementById('master'); btn.onclick=async function(){ const v=(inp.value||'').trim(); if(!v){ setStatus('请输入18位身份证号'); return } try{ log('login.skip_format_check'); log('login.req', 'id.len', v.length); const r = await fetch('/api/psc/auth/login/plain', { method:'POST', headers:{ 'Content-Type':'application/json' }, body: JSON.stringify({ master_password: v }) }); let j=null; try{ j=await r.json() }catch{}; log('login.status', r.status); log('login.json', JSON.stringify(j)); if(r.ok && j && j.token){ try{ localStorage.setItem('tk_plain', j.token) }catch{}; try{ const fp = await calcMasterFp(v); localStorage.setItem('mfp', fp) }catch{}; setStatus('登录成功,正在跳转...'); setTimeout(()=>{ location.href='index.html' }, 300) } else { if(j && j.error==='not_setup'){ setStatus('未初始化,请先设置登录密码'); return } if(j && j.error==='unauthorized'){ setStatus('身份证号不准确'); return } setStatus('登录失败') } } catch(e){ setStatus('网络错误,登录失败') } }; const cp=document.getElementById('btnCopyDebugBottom'); cp.onclick=async function(){ try{ await navigator.clipboard.writeText((document.getElementById('debugBottom')?.textContent)||''); setStatus('调试信息已复制') } catch{ setStatus('请手动复制调试信息') } } }
window.addEventListener('DOMContentLoaded', init)
</script>
</head>
<body>
<div class="container">
<h1>Yang's 网盘</h1>
<div id="statusTop"></div>
<div id="login">
<h2>登录</h2>
<input id="master" placeholder="18位身份证号" type="password" autocomplete="off" autocapitalize="off" spellcheck="false" />
<button id="btnLogin">登录</button>
<div style="margin:6px 0"><button id="btnCopyDebugBottom">复制调试信息</button></div>
<div id="status" style="margin-top:8px"></div>
<div id="debugBottom" class="debugbox"></div>
</div>
</div>
<script src="auth.js"></script>
</body>
</html>
+3
View File
@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<text y=".9em" font-size="90">💾</text>
</svg>

After

Width:  |  Height:  |  Size: 113 B

+29
View File
@@ -0,0 +1,29 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>分享下载</title>
<link rel="icon" href="/tools/psc/psc.svg" type="image/svg+xml" />
<link rel="stylesheet" href="/tools/psc/style.css" />
</head>
<body class="share-page">
<div class="container">
<h2>分享下载</h2>
<div class="row">
<input id="sharePwd" type="password" placeholder="分享密码" autocomplete="off" autocapitalize="off" spellcheck="false" name="no-save-share-open" />
<button id="btnOpen">打开</button>
</div>
<div id="status"></div>
<div id="info" class="hidden">
<div>文件:<span id="fname"></span></div>
<div>大小:<span id="fsize"></span></div>
<div class="row row-actions">
<button id="btnDownload">下载</button>
</div>
</div>
</div>
<script src="/tools/psc/share.js"></script>
</body>
</html>
@@ -0,0 +1,9 @@
{
"_comment": "理性锁工具的前端鉴权配置",
"enable_auth_comment": "true:启用鉴权(需 token 握手或已有会话);false:关闭鉴权",
"enable_auth": true,
"max_age_days_comment": "鉴权 Cookie 有效期(天),范围建议 1~365",
"max_age_days": 30,
"cookieName_comment": "鉴权 Cookie 名称,建议保持默认",
"cookieName": "rational_lock_gate"
}
+69
View File
@@ -0,0 +1,69 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>设置 - 理性锁</title>
<link rel="stylesheet" href="/common/common.css" />
<link rel="stylesheet" href="/tools/rational_lock/rational_lock.css" />
</head>
<body>
<main class="page">
<header class="hero">
<div class="hero-main">
<div>
<h1>设置</h1>
<p>在这里维护我的物品库,用于同类提醒和吃灰预警</p>
</div>
<div class="hero-auth">
<div id="auth-login-box" class="auth-login-inline">
<input id="login-username" autocomplete="username" />
<input id="login-password" type="password" autocomplete="current-password" />
<button id="btn-login" class="btn btn-primary" type="button">登录</button>
</div>
<div id="auth-logged-box" style="display:none">
<div class="auth-row">
<div id="auth-current-user" class="auth-current-user"></div>
<button id="btn-logout" class="btn" type="button">退出登录</button>
</div>
</div>
<div id="auth-status" class="status"></div>
</div>
</div>
</header>
<div id="app-content" style="display:none">
<section class="card">
<h2>我的物品库</h2>
<div class="form-actions">
<button id="btn-back-main" class="btn" type="button">返回主界面</button>
</div>
<div class="grid two">
<label>物品名称<input id="lib-name" /></label>
<label>分类
<select id="lib-category">
<option value="服饰">服饰</option><option value="数码">数码</option><option value="家居">家居</option><option value="美妆">美妆</option><option value="其他">其他</option>
</select>
</label>
<label class="full">备注<input id="lib-note" /></label>
</div>
<div class="form-actions">
<button id="btn-lib-add" class="btn" type="button">加入物品库</button>
<button id="btn-lib-cancel-edit" class="btn" type="button" style="display:none">取消修改</button>
</div>
<div id="lib-list" class="list"></div>
<div id="form-status" class="status"></div>
</section>
</div>
</main>
<div id="app-modal" class="modal-mask" style="display:none">
<div class="modal-panel">
<div id="modal-title" class="modal-title"></div>
<div id="modal-message" class="modal-message"></div>
<div id="modal-actions" class="modal-actions"></div>
</div>
</div>
<script src="/tools/rational_lock/settings.js"></script>
</body>
</html>
@@ -0,0 +1,9 @@
{
"_comment": "资产再平衡(Rebalance)前端的导航鉴权配置",
"enableCookieAuth_comment": "true:启用基于导航网关 nav_gate 的 cookie 鉴权",
"enableCookieAuth": true,
"cookieName_comment": "导航网关颁发的鉴权 cookie 名称",
"cookieName": "nav_gate",
"max_age_days_comment": "鉴权 cookie 的最大有效天数(1~365)",
"max_age_days": 30
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+7
View File
@@ -0,0 +1,7 @@
{
"_comment": "墙(Wall)工具的前端鉴权配置",
"enable_auth_comment": "true:启用鉴权(需要从导航登录);false:完全放开访问",
"enable_auth": true,
"max_age_days_comment": "鉴权 cookie 的最大有效天数(1~365)",
"max_age_days": 30
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

+7
View File
@@ -0,0 +1,7 @@
{
"_comment": "周报工具的前端鉴权配置",
"enable_auth_comment": "true:启用鉴权(需要从导航登录);false:完全放开访问周报工具",
"enable_auth": true,
"max_age_days_comment": "鉴权 cookie 的最大有效天数(1~365),30 天过期后从导航页重新握手",
"max_age_days": 30
}
+53
View File
@@ -0,0 +1,53 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>周报事件列表</title>
<link rel="icon" href="/icons/weekly.svg" type="image/svg+xml" />
<link rel="stylesheet" href="/common/common.css" />
<link rel="stylesheet" href="/tools/weekly_embed/weekly_embed.css" />
</head>
<body class="theme-cloud" data-page="events">
<div class="page">
<header class="top-bar">
<div class="time-controls">
<button id="btn-prev-week" class="btn btn-secondary">上一周</button>
<select id="week-year"></select>
<select id="week-list"></select>
<button id="btn-next-week" class="btn btn-secondary">下一周</button>
</div>
<div class="nav-links">
<a id="link-report" class="nav-link" href="index.html">周报</a>
<a id="link-events" class="nav-link active" href="events.html">事件列表</a>
</div>
</header>
<main class="content">
<section class="card">
<div class="card-header">
<h2>事件列表</h2>
<button id="btn-refresh-events" class="btn">刷新列表</button>
</div>
<div id="events" class="events"></div>
</section>
<div id="status" class="status" role="status" aria-live="polite"></div>
</main>
</div>
<div id="loading-overlay" role="dialog" aria-modal="true" aria-labelledby="loading-title">
<div id="loading-panel" tabindex="-1">
<div id="loading-header">
<div id="loading-title">加载中</div>
<button id="loading-close" aria-label="关闭">×</button>
</div>
<div id="loading-body">
<div id="loading-logs"></div>
</div>
<div id="loading-footer">
<button id="btn-copy-logs" class="btn btn-secondary" disabled>复制日志</button>
<button id="btn-loading-close" class="btn btn-secondary" disabled>关闭</button>
</div>
</div>
</div>
<script src="/tools/weekly_embed/weekly_embed.js"></script>
</body>
</html>
@@ -0,0 +1,61 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>周报查看</title>
<link rel="icon" href="/icons/weekly.svg" type="image/svg+xml" />
<link rel="stylesheet" href="/common/common.css" />
<link rel="stylesheet" href="/tools/weekly_embed/weekly_embed.css" />
</head>
<body class="theme-cloud" data-page="report">
<div class="page">
<header class="top-bar">
<div class="time-controls">
<button id="btn-prev-week" class="btn btn-secondary">上一周</button>
<select id="week-year"></select>
<select id="week-list"></select>
<button id="btn-next-week" class="btn btn-secondary">下一周</button>
</div>
<div class="nav-links">
<a id="link-report" class="nav-link active" href="weekly_embed.html">周报</a>
<a id="link-events" class="nav-link" href="events.html">事件列表</a>
</div>
</header>
<main class="content">
<section class="card">
<div class="card-header">
<h2>周报标题</h2>
<button id="btn-refresh-report" class="btn">刷新</button>
</div>
<div id="report-title" class="report-title muted">暂无周报</div>
</section>
<section class="card">
<h3>周报摘要</h3>
<div id="report-summary" class="report-summary muted">暂无摘要</div>
</section>
<section class="card">
<h3>周报内容</h3>
<div id="report-content" class="report-content muted">暂无内容</div>
</section>
<div id="status" class="status" role="status" aria-live="polite"></div>
</main>
</div>
<div id="loading-overlay" role="dialog" aria-modal="true" aria-labelledby="loading-title">
<div id="loading-panel" tabindex="-1">
<div id="loading-header">
<div id="loading-title">加载中</div>
<button id="loading-close" aria-label="关闭">×</button>
</div>
<div id="loading-body">
<div id="loading-logs"></div>
</div>
<div id="loading-footer">
<button id="btn-copy-logs" class="btn btn-secondary" disabled>复制日志</button>
<button id="btn-loading-close" class="btn btn-secondary" disabled>关闭</button>
</div>
</div>
</div>
<script src="/tools/weekly_embed/weekly_embed.js"></script>
</body>
</html>
+7
View File
@@ -0,0 +1,7 @@
{
"_comment": "微博工具的前端鉴权配置",
"enable_auth_comment": "true:启用鉴权(需要从导航登录);false:完全放开访问微博工具",
"enable_auth": true,
"max_age_days_comment": "鉴权 cookie 的最大有效天数(1~365)",
"max_age_days": 30
}
+64
View File
@@ -0,0 +1,64 @@
<%@ WebHandler Language="C#" Class="SaveArchive" %>
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Web;
public class SaveArchive : IHttpHandler
{
public bool IsReusable { get { return true; } }
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "application/json";
try
{
string body;
using (var reader = new StreamReader(context.Request.InputStream, Encoding.UTF8)) body = reader.ReadToEnd();
var url = ResolveNodeUrl();
var req = (HttpWebRequest)WebRequest.Create(url);
req.Method = "POST";
req.ContentType = "application/json";
var data = Encoding.UTF8.GetBytes(body);
using (var s = req.GetRequestStream()) s.Write(data, 0, data.Length);
using (var resp = (HttpWebResponse)req.GetResponse())
using (var rs = resp.GetResponseStream())
using (var r = new StreamReader(rs, Encoding.UTF8))
{
var txt = r.ReadToEnd();
context.Response.Write(txt);
}
}
catch (Exception e)
{
context.Response.StatusCode = 500;
var msg = "{\"ok\":false,\"error\":\"" + Escape(e.Message) + "\"}";
context.Response.Write(msg);
}
}
string ResolveNodeUrl()
{
var ports = new int[] { 8976, 5050 };
foreach (var p in ports)
{
var u = "http://localhost:" + p + "/api/archives/save";
if (Probe(u)) return u;
}
return "http://localhost:5050/api/archives/save";
}
bool Probe(string url)
{
try
{
var req = (HttpWebRequest)WebRequest.Create(url.Replace("/api/archives/save", "/api/ping"));
req.Method = "GET";
req.Timeout = 1500;
using (var resp = (HttpWebResponse)req.GetResponse()) return resp.StatusCode == HttpStatusCode.OK;
}
catch { return false; }
}
string Escape(string s)
{
return s.Replace("\\", "\\\\").Replace("\"", "\\\"");
}
}
+15
View File
@@ -0,0 +1,15 @@
{
"_comment": "圆桌派工具的鉴权配置",
"enable_auth_comment": "true:启用三级鉴权(需要从导航登录、token握手或GUID访问);false:完全放开访问",
"enable_auth": true,
"max_age_days_comment": "鉴权 cookie 的最大有效天数(1~365)",
"max_age_days": 30,
"cookieName_comment": "鉴权 Cookie 名称,建议保持默认",
"cookieName": "yuanzhupai_gate",
"requireGuid_comment": "true:入口必须带 guid 参数;false:允许仅凭 token 或会话访问",
"requireGuid": true,
"guidParam_comment": "URL 中的 GUID 参数名,建议使用小写 guid",
"guidParam": "guid",
"guidValue_comment": "GUID 参数值,建议使用高强度随机长串并定期更换",
"guidValue": "YUAN-ZHUOPAI-GUID-2025-SECURE-KEY-V8X9M2K4"
}
@@ -0,0 +1,296 @@
[
{
"title": "IRIS OUT",
"artist": "米津玄师",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/01_IRIS%20OUT_%E7%B1%B3%E6%B4%A5%E7%8E%84%E5%B8%88.mp3",
"cover": ""
},
{
"title": "AIZO",
"artist": "King Gnu",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/02_AIZO_King%20Gnu.mp3",
"cover": ""
},
{
"title": "Bakuretsu Aishiteru",
"artist": "M!LK",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/03_Bakuretsu%20Aishiteru_M%21LK.mp3",
"cover": ""
},
{
"title": "lulu.",
"artist": "Mrs. GREEN APPLE",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/05_lulu._Mrs.%20GREEN%20APPLE.mp3",
"cover": ""
},
{
"title": "コロンブス",
"artist": "Mrs. GREEN APPLE",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/6_%E3%82%B3%E3%83%AD%E3%83%B3%E3%83%96%E3%82%B9.mp3",
"cover": ""
},
{
"title": "ダンスホール",
"artist": "Mrs. GREEN APPLE",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/07_%E3%83%80%E3%83%B3%E3%82%B9%E3%83%9B%E3%83%BC%E3%83%AB.mp3",
"cover": ""
},
{
"title": "Call My Name",
"artist": "BE:FIRST",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/8_Call%20My%20Name.mp3",
"cover": ""
},
{
"title": "Let It Shine",
"artist": "Janet Jackson & BE:FIRST",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/9_Let%20It%20Shine.mp3",
"cover": ""
},
{
"title": "スターダスト",
"artist": "Official 髭男 dism",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/10_%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%80%E3%82%B9%E3%83%88.mp3",
"cover": ""
},
{
"title": "Halfmoon",
"artist": "King & Prince",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/11_Halfmoon.mp3",
"cover": ""
},
{
"title": "恋の予感",
"artist": "Aぇ! group",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/12_%E6%81%8B%E3%81%AE%E4%BA%88%E6%84%9F.mp3",
"cover": ""
},
{
"title": "Sparkle",
"artist": "FANTASTICS from EXILE TRIBE",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/13_Sparkle_FANTASTICS.mp3",
"cover": ""
},
{
"title": "夏の約束",
"artist": "乃木坂46",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/14_%E5%A4%8F%E3%81%AE%E7%B4%84%E6%9D%9F.mp3",
"cover": ""
},
{
"title": "夢物語",
"artist": "NMB48",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/15_%E5%A4%A2%E7%89%A9%E8%AA%9E.mp3",
"cover": ""
},
{
"title": "光の道",
"artist": "SixTONES",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/16_%E5%85%89no%E9%81%93.mp3",
"cover": ""
},
{
"title": "Snow Fantasy",
"artist": "Snow Man",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/17_Snow_Fantasy.mp3",
"cover": ""
},
{
"title": "クスシキ",
"artist": "Mrs. GREEN APPLE",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/18_%E3%82%AF%E3%82%B9%E3%82%B7%E3%82%AD.mp3",
"cover": ""
},
{
"title": "Lemon",
"artist": "米津玄师",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/19_Lemon.mp3",
"cover": ""
},
{
"title": "KICK BACK",
"artist": "米津玄师",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/20_KICK%20BACK.mp3",
"cover": ""
},
{
"title": "アイドル",
"artist": "YOASOBI",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/21_%E3%82%A2%E3%82%A4%E3%83%89%E3%83%AB.mp3",
"cover": ""
},
{
"title": "夜に駆ける",
"artist": "YOASOBI",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/22_%E5%A4%9C%E3%81%AB%E9%A7%86%E3%81%91%E3%82%8B.mp3",
"cover": ""
},
{
"title": "Sakura Wind",
"artist": "あいみょん",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/23_sakura_aimyon.mp3",
"cover": ""
},
{
"title": "ハルノヒ",
"artist": "あいみょん",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/24_%E3%83%8F%E3%83%AB%E3%83%8E%E3%83%92.mp3",
"cover": ""
},
{
"title": "Teenager Forever",
"artist": "King Gnu",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/25_Teenager%20Forever.mp3",
"cover": ""
},
{
"title": "白日",
"artist": "King Gnu",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/26_%E7%99%BD%E6%97%A5.mp3",
"cover": ""
},
{
"title": "Pretender",
"artist": "Official 髭男 dism",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/27_Pretender.mp3",
"cover": ""
},
{
"title": "I LOVE...",
"artist": "Official 髭男 dism",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/28_I%20LOVE.mp3",
"cover": ""
},
{
"title": "First Love",
"artist": "宇多田ヒカル",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/29_First%20Love.mp3",
"cover": ""
},
{
"title": "Flower of Life",
"artist": "宇多田ヒカル",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/30_Flower_of_Life.mp3",
"cover": ""
},
{
"title": "ZITTI E BUONI",
"artist": "Måneskin",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/31_ZITTI%20E%20BUONI.mp3",
"cover": ""
},
{
"title": "踊り子",
"artist": "Vaundy",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/32_%E8%B8%8A%E3%82%8A%E5%AD%90.mp3",
"cover": ""
},
{
"title": "怪獣の花唄",
"artist": "Vaundy",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/33_%E6%80%AA%E7%8D%A3%E3%81%AE%E8%8A%B1%E5%94%84.mp3",
"cover": ""
},
{
"title": "なんでもないよ、",
"artist": "マカロニえんぴつ",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/34_%E3%81%AA%E3%82%93%E3%81%A7%E3%82%82%E3%81%AA%E3%81%84yo.mp3",
"cover": ""
},
{
"title": "水平線",
"artist": "back number",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/35_%E6%B0%B4%E5%B9%B3%E7%B7%9A.mp3",
"cover": ""
},
{
"title": "高嶺の花子さん",
"artist": "back number",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/36_%E9%AB%98%E5%B6%BA%E3%81%AE%E8%8A%B1%E5%AD%90%E3%81%95%E3%82%93.mp3",
"cover": ""
},
{
"title": "Habit",
"artist": "SEKAI NO OWARI",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/37_Habit.mp3",
"cover": ""
},
{
"title": "RPG",
"artist": "SEKAI NO OWARI",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/38_RPG.mp3",
"cover": ""
},
{
"title": "Silent Night, Holy Night",
"artist": "福山雅治",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/39_Silent_Night_Fukuyama.mp3",
"cover": ""
},
{
"title": "桜坂",
"artist": "福山雅治",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/40_%E6%A1%9C%E5%9D%82.mp3",
"cover": ""
},
{
"title": "Butterfly Effect",
"artist": "日向坂46",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/41_Butterfly%20Effect.mp3",
"cover": ""
},
{
"title": "Start Over!",
"artist": "樱坂46",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/42_Start%20Over.mp3",
"cover": ""
},
{
"title": "Blue Sky",
"artist": "欅坂46",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/43_Blue_Sky.mp3",
"cover": ""
},
{
"title": "永遠のプレッシャー",
"artist": "AKB48",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/44_%E6%B0%B8%E9%81%A0no%E3%83%97%E3%83%AC%E3%83%83%E3%82%B7%E3%83%A3%E3%83%BC.mp3",
"cover": ""
},
{
"title": "Dynamite (Japanese Ver.)",
"artist": "BTS",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/45_Dynamite_Japanese_Ver.mp3",
"cover": ""
},
{
"title": "Perfect Night",
"artist": "LE SSERAFIM",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/46_Perfect%20Night.mp3",
"cover": ""
},
{
"title": "Drama",
"artist": "aespa",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/47_Drama.mp3",
"cover": ""
},
{
"title": "Bubble Gum",
"artist": "NewJeans",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/48_Bubble%20Gum.mp3",
"cover": ""
},
{
"title": "Plazma",
"artist": "米津玄师",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/49_Plazma.mp3",
"cover": ""
},
{
"title": "Yume no Tochu",
"artist": "YOASOBI",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_jan_mp3/50_yume_no_tochu.mp3",
"cover": ""
}
]
+15
View File
@@ -0,0 +1,15 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 180 180" width="180" height="180">
<rect width="180" height="180" rx="36" fill="#060612"/>
<circle cx="90" cy="79.2" r="57.6" stroke="#e8b86d" stroke-width="2.16" opacity="0.25" fill="none"/>
<ellipse cx="90" cy="151.2" rx="39.6" ry="7.2" fill="rgba(232,184,109,0.12)"/>
<path d="M59.4 118.8 C43.2 117 28.8 126 25.2 140.4 C21.6 151.2 28.8 158.4 43.2 156.6 C57.6 154.8 75.6 142.2 79.2 129.6 L79.2 120.6 Z" fill="#e8e6f0"/>
<path d="M120.6 118.8 C136.8 117 151.2 126 154.8 140.4 C158.4 151.2 151.2 158.4 136.8 156.6 C122.4 154.8 104.4 142.2 100.8 129.6 L100.8 120.6 Z" fill="#e8e6f0"/>
<path d="M79.2 120.6 C79.2 120.6 72 104.4 72 90 C72 72 79.2 61.2 86.4 54 L90 52.2 L93.6 54 C100.8 61.2 108 72 108 90 C108 104.4 100.8 120.6 100.8 120.6 C95.4 133.2 84.6 133.2 79.2 120.6 Z" fill="#e8e6f0"/>
<ellipse cx="90" cy="129.6" rx="18" ry="7.2" fill="#e8e6f0"/>
<rect x="82.8" y="45" width="14.4" height="12.6" rx="3.6" fill="#e8e6f0"/>
<ellipse cx="90" cy="30.6" rx="19.8" ry="21.6" fill="#e8e6f0"/>
<ellipse cx="90" cy="10.8" rx="9" ry="7.2" fill="#e8e6f0"/>
<path d="M61.2 64.8 Q50.4 59.4 50.4 52.2 Q50.4 45 61.2 39.6" stroke="#e8b86d" stroke-width="2.16" stroke-linecap="round" fill="none" opacity="0.7"/>
<path d="M118.8 64.8 Q129.6 59.4 129.6 52.2 Q129.6 45 118.8 39.6" stroke="#e8b86d" stroke-width="2.16" stroke-linecap="round" fill="none" opacity="0.7"/>
<circle cx="90" cy="12.6" r="2.7" fill="#e8b86d"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -0,0 +1,102 @@
[
{ "title": "奔腾", "artist": "周深", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/001_%E5%A5%94%E8%85%BE_%E5%91%A8%E6%B7%B1.mp3", "cover": "" },
{ "title": "晚风告白", "artist": "陈星然", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/002_%E6%99%9A%E9%A3%8E%E5%91%8A%E7%99%BD_%E9%99%88%E6%98%9F%E7%84%B6.mp3", "cover": "" },
{ "title": "龙耀华夏", "artist": "龙友林", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/003_%E9%BE%99%E8%80%80%E5%8D%8E%E5%A4%8F_%E9%BE%99%E5%8F%8B%E6%9E%97.mp3", "cover": "" },
{ "title": "觅光", "artist": "张韶涵", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/004_%E8%A7%85%E5%85%89_%E5%BC%A0%E9%9F%B6%E6%B6%B5.mp3", "cover": "" },
{ "title": "非凡", "artist": "刘德华", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/005_%E9%9D%9E%E5%87%A1_%E5%88%98%E5%BE%B7%E5%8D%8E.mp3", "cover": "" },
{ "title": "一半一半", "artist": "Top Barry", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/006_%E4%B8%80%E5%8D%8A%E4%B8%80%E5%8D%8A_Top%20Barry.mp3", "cover": "" },
{ "title": "城市荒岛", "artist": "林有珈", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/007_%E5%9F%8E%E5%B8%82%E8%8D%92%E5%B2%9B_%E6%9E%97%E6%9C%89%E7%8F%88.mp3", "cover": "" },
{ "title": "人造神", "artist": "丁程鑫", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/008_%E4%BA%BA%E9%80%A0%E7%A5%9E_%E4%B8%81%E7%A8%8B%E9%91%AB.mp3", "cover": "" },
{ "title": "晚风告白2026", "artist": "陈星然", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/009_%E6%99%9A%E9%A3%8E%E5%91%8A%E7%99%BD2026_%E9%99%88%E6%98%9F%E7%84%B6.mp3", "cover": "" },
{ "title": "雾中城", "artist": "独立乐团", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/010_%E9%9B%BE%E4%B8%AD%E5%9F%8E_%E7%8B%AC%E7%AB%8B%E4%B9%90%E5%9B%A2.mp3", "cover": "" },
{ "title": "外婆的菜园", "artist": "赵雷", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/011_%E5%A4%96%E5%A9%86%E7%9A%84%E8%8F%9C%E5%9B%AD_%E8%B5%B5%E9%9B%B7.mp3", "cover": "" },
{ "title": "夜未央", "artist": "张靓颖", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/012_%E5%A4%9C%E6%9C%AA%E5%A4%AE_%E5%BC%A0%E9%9D%93%E9%A2%96.mp3", "cover": "" },
{ "title": "城市霓虹", "artist": "王源", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/013_%E5%9F%8E%E5%B8%82%E9%9C%93%E8%99%B9_%E7%8E%8B%E6%BA%90.mp3", "cover": "" },
{ "title": "我会一直顺", "artist": "李荣浩", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/014_%E6%88%91%E4%BC%9A%E4%B8%80%E7%9B%B4%E9%A1%BA_%E6%9D%8E%E8%8D%A3%E6%B5%A9.mp3", "cover": "" },
{ "title": "记忆点", "artist": "未知", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/015_%E8%AE%B0%E5%BF%86%E7%82%B9_%E6%9C%AA%E7%9F%A5.mp3", "cover": "" },
{ "title": "春风入梦", "artist": "未知", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/016_%E6%98%A5%E9%A3%8E%E5%85%A5%E6%A2%A6_%E6%9C%AA%E7%9F%A5.mp3", "cover": "" },
{ "title": "离开我的依赖", "artist": "陈粒", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/017_%E7%A6%BB%E5%BC%80%E6%88%91%E7%9A%84%E4%BE%9D%E8%B5%96_%E9%99%88%E7%B2%92.mp3", "cover": "" },
{ "title": "撕心裂肺的思念", "artist": "未知", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/018_%E6%92%95%E5%BF%83%E8%A3%82%E8%82%BA%E7%9A%84%E6%80%9D%E5%BF%B5_%E6%9C%AA%E7%9F%A5.mp3", "cover": "" },
{ "title": "大风在刮大雪在下", "artist": "六小乐", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/019_%E5%A4%A7%E9%A3%8E%E5%9C%A8%E5%88%AE%E5%A4%A7%E9%9B%AA%E5%9C%A8%E4%B8%8B_%E5%85%AD%E5%B0%8F%E4%B9%90.mp3", "cover": "" },
{ "title": "来生别再成遗憾", "artist": "烟嗓超哥", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/020_%E6%9D%A5%E7%94%9F%E5%88%AB%E5%86%8D%E6%88%90%E9%81%97%E6%86%BE_%E7%83%9F%E5%97%93%E8%B5%85%E5%93%A5.mp3", "cover": "" },
{ "title": "相思无果", "artist": "未知", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/021_%E7%9B%8E%E6%80%9D%E6%97%A0%E6%9E%9C_%E6%9C%AA%E7%9F%A5.mp3", "cover": "" },
{ "title": "心碎的梦", "artist": "卡带森林", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/022_%E5%BF%83%E7%A2%8E%E7%9A%84%E6%A2%A6_%E5%8D%A1%E5%B8%A6%E6%A3%AE%E6%9E%97.mp3", "cover": "" },
{ "title": "街角的晚风", "artist": "陈小春", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/023_%E8%A1%97%E8%A7%92%E7%9A%84%E6%99%9A%E9%A3%8E_%E9%99%88%E5%B0%8F%E6%98%A5.mp3", "cover": "" },
{ "title": "樱花最美的是飘落", "artist": "小西", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/024_%E6%A8%B1%E8%8A%B1%E6%9C%80%E7%BE%8E%E7%9A%84%E6%98%AF%E9%A3%98%E8%90%BD_%E5%B0%8F%E8%A5%BF.mp3", "cover": "" },
{ "title": "醉在这个冬", "artist": "未知", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/025_%E9%86%89%E5%9C%A8%E8%BF%99%E4%B8%AA%E5%86%AC_%E6%9C%AA%E7%9F%A5.mp3", "cover": "" },
{ "title": "医不好的伤", "artist": "王佳音", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/026_%E5%8C%BB%E4%B8%8D%E5%A5%BD%E7%9A%84%E4%BC%A4_%E7%8E%8B%E4%BD%B3%E9%9F%B3.mp3", "cover": "" },
{ "title": "放过了你放不过自己", "artist": "未知", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/027_%E6%94%BE%E8%BF%87%E4%BA%86%E4%BD%A0%E6%94%BE%E4%B8%8D%E8%BF%87%E8%87%AA%E5%B7%B1_%E6%9C%AA%E7%9F%A5.mp3", "cover": "" },
{ "title": "城市的夜", "artist": "未知", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/028_%E5%9F%8E%E5%B8%82%E7%9A%84%E5%A4%9C_%E6%9C%AA%E7%9F%A5.mp3", "cover": "" },
{ "title": "追光者", "artist": "岑宁儿", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/029_%E8%BF%BD%E5%85%89%E8%80%85_%E5%B2%91%E5%AE%81%E5%84%BF.mp3", "cover": "" },
{ "title": "孤勇者", "artist": "陈奕迅", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/030_%E5%AD%A4%E5%8B%87%E8%80%85_%E9%99%88%E5%A5%95%E8%BF%85.mp3", "cover": "" },
{ "title": "星辰大海", "artist": "黄霄雲", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/031_%E6%98%9F%E8%BE%B0%E5%A4%A7%E6%B5%B7_%E9%BB%84%E9%9C%84%E9%9B%B2.mp3", "cover": "" },
{ "title": "错位时空", "artist": "艾辰", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/032_%E9%94%99%E4%BD%8D%E6%97%A0%E7%A9%BA_%E8%89%BE%E8%BE%B0.mp3", "cover": "" },
{ "title": "白月光与朱砂痣", "artist": "大籽", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/033_%E7%99%BD%E6%9C%88%E5%85%89%E4%B8%8E%E6%9C%B1%E7%A0%82%E7%97%A3_%E5%A4%A7%E5%B1%BD.mp3", "cover": "" },
{ "title": "踏山河", "artist": "七叔", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/034_%E8%B8%8F%E5%B1%B1%E6%B2%B3_%E4%B8%83%E5%8F%94.mp3", "cover": "" },
{ "title": "四季予你", "artist": "程响", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/035_%E5%9B%9B%E5%AD%A3%8E%E4%BA%88%E4%BD%A0_%E7%A8%8B%E5%93%8D.mp3", "cover": "" },
{ "title": "燕无歇", "artist": "蒋雪儿", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/036_%E7%87%95%E6%97%A0%E6%AD%87_%E8%92%8B%E9%9B%AA%E5%84%BF.mp3", "cover": "" },
{ "title": "莫问归期", "artist": "蒋雪儿", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/037_%E8%8E%AB%E9%97%AE%E5%BD%92%E6%9C%9F_%E8%92%8B%E9%9B%AA%E5%84%BF.mp3", "cover": "" },
{ "title": "赤伶", "artist": "HITA", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/038_%E8%B5%A4%E4%BC%B6_HITA.mp3", "cover": "" },
{ "title": "下山", "artist": "要不要买菜", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/039_%E4%B8%8B%E5%B1%B1_%E8%A6%81%E4%B8%8D%E8%A6%81%E4%B9%B0%E8%8F%9C.mp3", "cover": "" },
{ "title": "惊雷", "artist": "MC九局", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/040_%E6%83%8A%E9%9B%B7_MC%E4%B9%9D%E5%B1%80.mp3", "cover": "" },
{ "title": "少年", "artist": "梦然", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/041_%E5%B0%89%E5%B9%B4_%E6%A2%A6%E7%84%B6.mp3", "cover": "" },
{ "title": "世界这么大还是遇见你", "artist": "程响", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/042_%E4%B8%96%E7%95%8C%E8%BF%99%E4%B9%88%E5%A4%A7%E8%BF%98%E6%98%AF%E7%81%87%E8%A7%81%E4%BD%A0_%E7%A8%8B%E5%93%8D.mp3", "cover": "" },
{ "title": "你的答案", "artist": "阿冗", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/043_%E4%BD%A0%E7%9A%84%E7%AD%94%E6%A1%88_%E9%98%BF%E5%86%97.mp3", "cover": "" },
{ "title": "绿色", "artist": "陈雪凝", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/044_%E7%BB%BF%E8%89%B2_%E9%99%88%E9%9B%AA%E5%87%9D.mp3", "cover": "" },
{ "title": "你的酒馆对我打了烊", "artist": "陈雪凝", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/045_%E4%BD%A0%E7%9A%84%E8%85%89%E9%A6%86%E5%AF%B9%E6%88%91%E6%89%93%E4%BA%86%E7%83%8A_%E9%99%88%E9%9B%AA%E5%87%9D.mp3", "cover": "" },
{ "title": "芒种", "artist": "音阙诗听", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/046_%E8%8A%92%E7%A7%8D_%E9%9F%B3%E9%98%99%E8%AF%97%E5%90%AC.mp3", "cover": "" },
{ "title": "红昭愿", "artist": "音阙诗听", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/047_%E7%BA%A2%E6%98%AD%E6%84%BF_%E9%9F%B3%E9%98%99%E8%AF%97%E5%90%AC.mp3", "cover": "" },
{ "title": "出山", "artist": "花粥", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/048_%E5%87%BA%E5%B1%B1_%E8%8A%B1%E7%B2%A5.mp3", "cover": "" },
{ "title": "盗将行", "artist": "花粥", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/049_%E7%9B%97%E5%B0%86%E8%A1%8C_%E8%8A%B1%E7%B2%A5.mp3", "cover": "" },
{ "title": "可能否", "artist": "木小雅", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/050_%E5%8F%AF%E8%83%BD%E5%90%A6_%E6%9C%A8%E5%B0%8F%E4%B9%9B%85.mp3", "cover": "" },
{ "title": "往后余生", "artist": "马良", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/051_%E5%BE%80%E5%90%8E%E4%BD%99%E7%94%9F_%E9%A9%AC%E8%89%AF.mp3", "cover": "" },
{ "title": "讲真的", "artist": "曾惜", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/052_%E8%AE%B2%E7%9C%9F%E7%9A%84_%E6%9B%BE%E6%83%9C.mp3", "cover": "" },
{ "title": "体面", "artist": "于文文", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/053_%E4%BD%93%E9%9D%A2_%E4%BA%8E%E6%96%87%E6%96%87.mp3", "cover": "" },
{ "title": "说散就散", "artist": "袁娅维", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/054_%E8%AF%B4%E6%95%A3%E5%B0%8B%E6%95%A3_%E8%A2%81%E5%A8%85%E7%BB%B4.mp3", "cover": "" },
{ "title": "沙漠骆驼", "artist": "展展与罗罗", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/055_%E6%B2%99%E6%BC%A0%E9%AA%86%E9%A9%BC_%E5%B1%95%E5%B1%95%E4%B8%8E%E7%BD%97%E7%BD%97.mp3", "cover": "" },
{ "title": "不仅仅是喜欢", "artist": "孙语赛", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/056_%E4%B8%8D%E4%BB%85%E4%BB%85%E6%98%AF%E5%96%9C%E6%AC%A2_%E5%AD%99%E8%AF%AD%E8%B5%9B.mp3", "cover": "" },
{ "title": "学猫叫", "artist": "小潘潘", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/057_%E5%AD%A6%E7%8C%AB%E5%8F%AB_%E5%B0%8F%E6%BD%98%E6%BD%98.mp3", "cover": "" },
{ "title": "佛系少女", "artist": "冯提莫", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/058_%E4%BD%93%E7%B3%BB%E5%B0%89%E5%A5%87_%E5%86%AF%E6%8F%90%E8%8E%AB.mp3", "cover": "" },
{ "title": "病变", "artist": "CG", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/059_%E7%97%85%E5%8F%98_CG.mp3", "cover": "" },
{ "title": "桥边姑娘", "artist": "海伦", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/060_%E6%A1%A5%E8%BE%B9%E5%A7%91%E5%A8%98_%E6%B5%B7%E4%BC%A0.mp3", "cover": "" },
{ "title": "大田后生仔", "artist": "林啟得", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/061_%E5%A4%A7%E7%94%B0%E5%90%8E%E7%94%9F%E4%BB%94_%E6%9E%97%E5%95%9F%E5%BE%97.mp3", "cover": "" },
{ "title": "野狼disco", "artist": "宝石Gem", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/062_%E9%87%8E%E7%8B%AE_disco_%E5%AE%9D%E7%9F%B3_Gem.mp3", "cover": "" },
{ "title": "火红的萨日朗", "artist": "乌兰托娅", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/063_%E7%81%AB%E7%BA%A2%E7%9A%84%E8%90%A8%E6%97%A5%E6%9C%97_%E4%B9%8C%E5%85%B0%E6%89%9F%E5%A8%85.mp3", "cover": "" },
{ "title": "你笑起来真好看", "artist": "李昕融", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/064_%E4%BD%A0%E7%AC%91%E8%B5%B7%E6%9D%A5%E7%9C%9C%E6%9C%9F%E5%A5%BD%E7%9C%8B_%E6%9D%8E%E6%98%95%E8%9E%8D.mp3", "cover": "" },
{ "title": "可可托海的牧羊人", "artist": "王琪", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/065_%E5%8F%AF%E5%8F%AF%E6%89%9F%E6%B5%B7%E7%9A%84%E7%89%A7%E7%BE%8A%E4%BA%BA_%E7%8E%8B%E7%90%AA.mp3", "cover": "" },
{ "title": "送亲", "artist": "王琪", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/066_%E9%80%81%E4%BA%B2_%E7%8E%8B%E7%90%AA.mp3", "cover": "" },
{ "title": "万爱千恩", "artist": "王琪", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/067_%E4%B8%87%E7%88%B1%E5%8D%83%E6%81%A9_%E7%8E%8B%E7%90%AA.mp3", "cover": "" },
{ "title": "枕边的童话", "artist": "小乐哥", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/068_%E6%9C%95%E8%BE%B9%E7%9A%84%E7%AB%A5%E8%AF%9D_%E5%B0%8F%E4%B9%90%E5%93%A5.mp3", "cover": "" },
{ "title": "执迷不悟", "artist": "小乐哥", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/069_%E6%89%A7%E8%BF%87%E4%B8%8D%E6%82%9F_%E5%B0%8F%E4%B9%90%E5%93%A5.mp3", "cover": "" },
{ "title": "孤城", "artist": "洛先生", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/070_%E5%AD%A4%E5%9F%8E_%E6%B4%9B%E5%85%88%E7%94%9C.mp3", "cover": "" },
{ "title": "热爱105°C的你", "artist": "阿肆", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/071_%E7%83%AD%E7%88%B1_105_%C2%B0C_%E7%9A%84%E4%BD%A0_%E9%98%BF%E8%82%86.mp3", "cover": "" },
{ "title": "阳光彩虹小白马", "artist": "大张伟", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/072_%E9%98%B3%E5%85%89%E5%BD%A9%E8%99%B9%E5%B0%8F%E7%99%BD%E9%A9%AC_%E5%A4%A7%E5%BC%A0%E4%BC%9F.mp3", "cover": "" },
{ "title": "小城夏天", "artist": "LBI利比", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/073_%E5%B0%8F%E5%9F%8E%E5%A4%8F%E5%A4%A9_LBI%E5%88%A9%E6%AF%94.mp3", "cover": "" },
{ "title": "如愿", "artist": "王菲", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/074_%E5%A6%82%E6%84%BF_%E7%8E%8B%E8%8F%B2.mp3", "cover": "" },
{ "title": "光的方向", "artist": "张碧晨", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/075_%E5%85%89%E7%9A%84%E6%96%B9%E5%90%91_%E5%BC%A0%E7%A2%A7%E6%99%A8.mp3", "cover": "" },
{ "title": "起风了", "artist": "买辣椒也用券", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/076_%E8%B5%B7%E9%A3%8E%E4%BA%86_%E4%B9%B0%E8%BE%A3%E6%A4%92%E4%B9%9F%E7%94%A8%E5%88%B8.mp3", "cover": "" },
{ "title": "若梦", "artist": "周深", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/077_%E8%8B%A5%E6%A2%A6_%E5%91%A8%E6%B7%B1.mp3", "cover": "" },
{ "title": "和光同尘", "artist": "周深", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/078_%E5%92%8C%E5%85%89%E5%90%8C%E5%B0%89_%E5%91%A8%E6%B7%B1.mp3", "cover": "" },
{ "title": "大鱼", "artist": "周深", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/079_%E5%A4%A7%E9%B1%BC_%E5%91%A8%E6%B7%B1.mp3", "cover": "" },
{ "title": "灯火里的中国", "artist": "张也", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/080_%E7%81%AF%E7%81%AB%E9%87%8C%E7%9A%84%E4%B8%AD%E5%9B%BD_%E5%BC%A0%E4%B9%9F.mp3", "cover": "" },
{ "title": "一路生花", "artist": "温奕心", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/081_%E4%B8%80%E8%B7%AF%E7%94%9C%E8%8A%B1_%E6%B8%A9%E5%A5%95%E5%BF%83.mp3", "cover": "" },
{ "title": "岁月神偷", "artist": "金玟岐", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/082_%E5%B2%81%E6%9C%88%E7%A5%9E%E5%81%B7_%E9%87%91%E7%8E%9F%E5%B2%90.mp3", "cover": "" },
{ "title": "时间煮雨", "artist": "郁可唯", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/083_%E6%97%B6%E5%97%B4%E7%85%AE%E9%9B%A8_%E9%83%81%E5%8F%AF%E5%94%AF.mp3", "cover": "" },
{ "title": "破茧", "artist": "张韶涵", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/084_%E7%A0%B4%E8%8C%A7_%E5%BC%A0%E9%9F%B6%E6%B6%B5.mp3", "cover": "" },
{ "title": "Mojito", "artist": "周杰伦", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/085_Mojito_%E5%91%A8%E6%9D%B0%E4%BC%A0.mp3", "cover": "" },
{ "title": "笑看", "artist": "未知", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/086_%E7%AC%91%E7%9C%8B_%E6%9C%AA%E7%9F%A5.mp3", "cover": "" },
{ "title": "醒狮", "artist": "未知", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/087_%E9%86%89%E7%8B%AE_%E6%9C%AA%E7%9F%A5.mp3", "cover": "" },
{ "title": "笑柄", "artist": "未知", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/088_%E7%AC%91%E6%9F%84_%E6%9C%AA%E7%9F%A5.mp3", "cover": "" },
{ "title": "风月", "artist": "未知", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/089_%E9%A3%8E%E6%9C%88_%E6%9C%AA%E7%9F%A5.mp3", "cover": "" },
{ "title": "不知名", "artist": "未知", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/090_%E4%B8%8D%E7%9F%A5%E5%90%8C_%E6%9C%AA%E7%9F%A5.mp3", "cover": "" },
{ "title": "Panama", "artist": "Matteo", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/091_Panama_Matteo.mp3", "cover": "" },
{ "title": "最美期待", "artist": "南拳妈妈", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/092_%E6%9C%80%E7%BE%8E%E6%9C%9F%E5%BE%85_%E5%8D%97%E6%8B%B3%E5%A6%88%E5%A6%88.mp3", "cover": "" },
{ "title": "答案", "artist": "杨坤", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/093_%E7%AD%94%E6%A1%88_%E6%9D%A8%E5%9D%A4.mp3", "cover": "" },
{ "title": "凤凰花开的路口", "artist": "林志炫", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/094_%E5%87%A4%E5%87%B0%E8%8A%B1%E5%BC%80%E7%9A%84%E8%B7%AF%E5%8F%A3_%E6%9E%97%E5%BF%97%E7%82%AB.mp3", "cover": "" },
{ "title": "蜜雪冰城甜蜜蜜", "artist": "蜜雪冰城", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/095_%E8%9C%9C%E9%9B%AA%E5%86%B0%E5%9F%8E%E7%94%9C%E8%9C%9C%E8%9C%9C_%E8%9C%9C%E9%9B%AA%E5%86%B0%E5%9F%8E.mp3", "cover": "" },
{ "title": "晚风告白2026", "artist": "陈星然", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/096_%E6%99%9A%E9%A3%8E%E5%91%8A%E7%99%BD2026_%E9%99%88%E6%98%9F%E7%84%B6.mp3", "cover": "" },
{ "title": "星辰大海黄霄雲版", "artist": "黄霄雲", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/097_%E6%98%9F%E8%BE%B0%E5%A4%A7%E6%B5%B7%E9%BB%84%E9%9C%84%E9%9B%B2%E7%89%88_%E9%BB%84%E9%9C%84%E9%9B%B2.mp3", "cover": "" },
{ "title": "热爱105度的你", "artist": "阿肆", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/098_%E7%83%AD%E7%88%B1_105_%E5%BA%A6%E7%9A%84%E4%BD%A0_%E9%98%BF%E8%82%86.mp3", "cover": "" },
{ "title": "Rubia", "artist": "周深", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/099_Rubia_%E5%91%A8%E6%B7%B1.mp3", "cover": "" },
{ "title": "遇见2026翻红版", "artist": "阿肆", "src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026/douyin_top100/100_%E9%81%87%E8%A7%81_2026_%E7%BF%BB%E7%BA%A2%E7%89%88_%E9%98%BF%E8%82%86.mp3", "cover": "" }
]
+109
View File
@@ -0,0 +1,109 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>生成八音盒图标</title>
<style>
body {
font-family: -apple-system, sans-serif;
max-width: 600px;
margin: 40px auto;
padding: 20px;
background: #060612;
color: #e8e6f0;
}
h1 { color: #e8b86d; }
.button-group { margin: 20px 0; }
button {
background: #e8b86d;
color: #060612;
border: none;
padding: 12px 24px;
margin: 8px;
border-radius: 8px;
cursor: pointer;
font-size: 16px;
}
.previews { margin-top: 40px; }
.preview-item { margin: 20px 0; padding: 20px; background: rgba(255,255,255,0.05); border-radius: 8px; }
canvas { background: #060612; border: 1px solid rgba(232,184,109,0.3); border-radius: 8px; }
</style>
</head>
<body>
<h1>🎵 八音盒图标生成器</h1>
<p>点击下方按钮,下载所需尺寸的PNG图标</p>
<div class="button-group">
<button onclick="generateAndDownload(192, 192, 'icon-192.png')">下载 192x192</button>
<button onclick="generateAndDownload(512, 512, 'icon-512.png')">下载 512x512</button>
<button onclick="generateAndDownload(180, 180, 'apple-touch-icon.png')">下载 180x180 (Apple)</button>
</div>
<div class="previews">
<h3>预览</h3>
<div class="preview-item">
<p>192x192</p>
<canvas id="canvas192" width="192" height="192"></canvas>
</div>
<div class="preview-item">
<p>512x512</p>
<canvas id="canvas512" width="512" height="512"></canvas>
</div>
</div>
<script>
const svgCode = `
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<rect width="100" height="100" rx="20" fill="#060612"/>
<circle cx="50" cy="44" r="32" stroke="#e8b86d" stroke-width="1.2" opacity="0.25" fill="none"/>
<path d="M33 66 C24 65 16 70 14 78 C12 84 16 88 24 87 C32 86 42 79 44 72 L44 67 Z" fill="#e8e6f0"/>
<path d="M67 66 C76 65 84 70 86 78 C88 84 84 88 76 87 C68 86 58 79 56 72 L56 67 Z" fill="#e8e6f0"/>
<path d="M44 67 C44 67 40 58 40 50 C40 40 44 34 48 30 L50 29 L52 30 C56 34 60 40 60 50 C60 58 56 67 56 67 C53 74 47 74 44 67 Z" fill="#e8e6f0"/>
<ellipse cx="50" cy="72" rx="10" ry="4" fill="#e8e6f0"/>
<rect x="46" y="25" width="8" height="7" rx="2" fill="#e8e6f0"/>
<ellipse cx="50" cy="17" rx="11" ry="12" fill="#e8e6f0"/>
<ellipse cx="50" cy="6" rx="5" ry="4" fill="#e8e6f0"/>
<path d="M34 36 Q28 33 28 29 Q28 25 34 22" stroke="#e8b86d" stroke-width="1.2" stroke-linecap="round" fill="none" opacity="0.7"/>
<path d="M66 36 Q72 33 72 29 Q72 25 66 22" stroke="#e8b86d" stroke-width="1.2" stroke-linecap="round" fill="none" opacity="0.7"/>
<circle cx="50" cy="7" r="1.5" fill="#e8b86d"/>
</svg>
`;
async function drawIconOnCanvas(canvas, size) {
return new Promise((resolve) => {
const ctx = canvas.getContext('2d');
const img = new Image();
const svgBlob = new Blob([svgCode], { type: 'image/svg+xml' });
const url = URL.createObjectURL(svgBlob);
img.onload = () => {
ctx.clearRect(0, 0, size, size);
ctx.drawImage(img, 0, 0, size, size);
URL.revokeObjectURL(url);
resolve();
};
img.src = url;
});
}
async function generateAndDownload(width, height, filename) {
const canvas = document.createElement('canvas');
canvas.width = width;
canvas.height = height;
await drawIconOnCanvas(canvas, width);
const link = document.createElement('a');
link.download = filename;
link.href = canvas.toDataURL('image/png');
link.click();
}
// 初始化预览
(async function init() {
await drawIconOnCanvas(document.getElementById('canvas192'), 192);
await drawIconOnCanvas(document.getElementById('canvas512'), 512);
})();
</script>
</body>
</html>
+15
View File
@@ -0,0 +1,15 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="192" height="192">
<rect width="100" height="100" rx="20" fill="#060612"/>
<circle cx="50" cy="44" r="32" stroke="#e8b86d" stroke-width="1.2" opacity="0.25" fill="none"/>
<ellipse cx="50" cy="84" rx="22" ry="4" fill="rgba(232,184,109,0.12)"/>
<path d="M33 66 C24 65 16 70 14 78 C12 84 16 88 24 87 C32 86 42 79 44 72 L44 67 Z" fill="#e8e6f0"/>
<path d="M67 66 C76 65 84 70 86 78 C88 84 84 88 76 87 C68 86 58 79 56 72 L56 67 Z" fill="#e8e6f0"/>
<path d="M44 67 C44 67 40 58 40 50 C40 40 44 34 48 30 L50 29 L52 30 C56 34 60 40 60 50 C60 58 56 67 56 67 C53 74 47 74 44 67 Z" fill="#e8e6f0"/>
<ellipse cx="50" cy="72" rx="10" ry="4" fill="#e8e6f0"/>
<rect x="46" y="25" width="8" height="7" rx="2" fill="#e8e6f0"/>
<ellipse cx="50" cy="17" rx="11" ry="12" fill="#e8e6f0"/>
<ellipse cx="50" cy="6" rx="5" ry="4" fill="#e8e6f0"/>
<path d="M34 36 Q28 33 28 29 Q28 25 34 22" stroke="#e8b86d" stroke-width="1.2" stroke-linecap="round" fill="none" opacity="0.7"/>
<path d="M66 36 Q72 33 72 29 Q72 25 66 22" stroke="#e8b86d" stroke-width="1.2" stroke-linecap="round" fill="none" opacity="0.7"/>
<circle cx="50" cy="7" r="1.5" fill="#e8b86d"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

+15
View File
@@ -0,0 +1,15 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="512" height="512">
<rect width="100" height="100" rx="20" fill="#060612"/>
<circle cx="50" cy="44" r="32" stroke="#e8b86d" stroke-width="1.2" opacity="0.25" fill="none"/>
<ellipse cx="50" cy="84" rx="22" ry="4" fill="rgba(232,184,109,0.12)"/>
<path d="M33 66 C24 65 16 70 14 78 C12 84 16 88 24 87 C32 86 42 79 44 72 L44 67 Z" fill="#e8e6f0"/>
<path d="M67 66 C76 65 84 70 86 78 C88 84 84 88 76 87 C68 86 58 79 56 72 L56 67 Z" fill="#e8e6f0"/>
<path d="M44 67 C44 67 40 58 40 50 C40 40 44 34 48 30 L50 29 L52 30 C56 34 60 40 60 50 C60 58 56 67 56 67 C53 74 47 74 44 67 Z" fill="#e8e6f0"/>
<ellipse cx="50" cy="72" rx="10" ry="4" fill="#e8e6f0"/>
<rect x="46" y="25" width="8" height="7" rx="2" fill="#e8e6f0"/>
<ellipse cx="50" cy="17" rx="11" ry="12" fill="#e8e6f0"/>
<ellipse cx="50" cy="6" rx="5" ry="4" fill="#e8e6f0"/>
<path d="M34 36 Q28 33 28 29 Q28 25 34 22" stroke="#e8b86d" stroke-width="1.2" stroke-linecap="round" fill="none" opacity="0.7"/>
<path d="M66 36 Q72 33 72 29 Q72 25 66 22" stroke="#e8b86d" stroke-width="1.2" stroke-linecap="round" fill="none" opacity="0.7"/>
<circle cx="50" cy="7" r="1.5" fill="#e8b86d"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

+20
View File
@@ -0,0 +1,20 @@
{
"name": "八音盒",
"short_name": "八音盒",
"start_url": "./index.html",
"display": "standalone",
"background_color": "#060612",
"theme_color": "#060612",
"icons": [
{
"src": "icon-192.svg",
"sizes": "192x192",
"type": "image/svg+xml"
},
{
"src": "icon-512.svg",
"sizes": "512x512",
"type": "image/svg+xml"
}
]
}
@@ -0,0 +1,127 @@
[
{
"title": "01、第一部 洪武大帝(明太祖朱元璋篇)驱除鞑虏,恢复中华",
"artist": "",
"src": "https://android-o1-images.oss-cn-shanghai.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/mingchao_mp3/1.%E6%98%8E%E6%9C%9D%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF%20%5B%E6%9C%89%E5%A3%B0%E4%B9%A6%5D%20%E7%AC%AC%E4%B8%80%E9%83%A8.mp3",
"cover": ""
},{
"title": "02、第一部 洪武大帝(明惠宗朱允炆篇)天胡开局,毁于削藩",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/mingchao_mp3/2.%20%E6%98%8E%E6%9C%9D%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF%20%5B%E6%9C%89%E5%A3%B0%E4%B9%A6%5D%20%E7%AC%AC%E4%B8%80%E9%83%A8%20%E6%B4%AA%E6%AD%A6%E5%A4%A7%E5%B8%9D%EF%BC%88%E6%98%8E%E6%83%A0%E5%AE%97%E6%9C%B1%E5%85%81%E7%82%86%E7%AF%87%EF%BC%89%E5%A4%A9%E8%83%A1%E5%BC%80%E5%B1%80%EF%BC%8C%E6%AF%81%E4%BA%8E%E5%89%8A%E8%97%A9.mp3",
"cover": ""
},
{
"title": "03、第二部 万国来朝(明成祖朱棣篇)平定天下,修成大典",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/mingchao_mp3/part2/3.%20%E6%98%8E%E6%9C%9D%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF%20%5B%E6%9C%89%E5%A3%B0%E4%B9%A6%5D%20%E7%AC%AC%E4%BA%8C%E9%83%A8%20%E4%B8%87%E5%9B%BD%E6%9D%A5%E6%9C%9D%EF%BC%88%E6%98%8E%E6%88%90%E7%A5%96%E6%9C%B1%E6%A3%A3%E7%AF%87%EF%BC%89%E5%B9%B3%E5%AE%9A%E5%A4%A9%E4%B8%8B%EF%BC%8C%E4%BF%AE%E6%88%90%E5%A4%A7%E5%85%B8.mp3",
"cover": ""
},
{
"title": "04、第二部 万国来朝(明仁宗朱高炽篇)诚孝仁厚,无疾骤崩",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/mingchao_mp3/%E7%AC%AC%E4%BA%8C%E9%83%A8_%E4%B8%87%E5%9B%BD%E6%9D%A5%E6%9C%9D/4.%20%E6%98%8E%E6%9C%9D%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF%20%5B%E6%9C%89%E5%A3%B0%E4%B9%A6%5D%20%E7%AC%AC%E4%BA%8C%E9%83%A8%20%E4%B8%87%E5%9B%BD%E6%9D%A5%E6%9C%9D%EF%BC%88%E6%98%8E%E4%BB%81%E5%AE%97%E6%9C%B1%E9%AB%98%E7%82%BD%E7%AF%87%EF%BC%89%E8%AF%9A%E5%AD%9D%E4%BB%81%E5%8E%9A%EF%BC%8C%E6%97%A0%E7%96%BE%E9%AA%A4%E5%B4%A9.mp3",
"cover": ""
},
{
"title": "05、第二部 万国来朝(明宣宗朱瞻基篇)仁宣之治,宦官干政",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/mingchao_mp3/%E7%AC%AC%E4%BA%8C%E9%83%A8_%E4%B8%87%E5%9B%BD%E6%9D%A5%E6%9C%9D/5.%20%E6%98%8E%E6%9C%9D%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF%20%5B%E6%9C%89%E5%A3%B0%E4%B9%A6%5D%20%E7%AC%AC%E4%BA%8C%E9%83%A8%20%E4%B8%87%E5%9B%BD%E6%9D%A5%E6%9C%9D%EF%BC%88%E6%98%8E%E5%AE%A3%E5%AE%97%E6%9C%B1%E7%9E%BB%E5%9F%BA%E7%AF%87%EF%BC%89%E4%BB%81%E5%AE%A3%E4%B9%8B%E6%B2%BB%EF%BC%8C%E5%AE%A6%E5%AE%98%E5%B9%B2%E6%94%BF.mp3",
"cover": ""
},
{
"title": "06、第二部 万国来朝(明英宗朱祁镇篇)土木之变,漠北为囚",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/mingchao_mp3/%E7%AC%AC%E4%BA%8C%E9%83%A8_%E4%B8%87%E5%9B%BD%E6%9D%A5%E6%9C%9D/6.%20%E6%98%8E%E6%9C%9D%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF%20%5B%E6%9C%89%E5%A3%B0%E4%B9%A6%5D%20%E7%AC%AC%E4%BA%8C%E9%83%A8%20%E4%B8%87%E5%9B%BD%E6%9D%A5%E6%9C%9D%EF%BC%88%E6%98%8E%E8%8B%B1%E5%AE%97%E6%9C%B1%E7%A5%81%E9%95%87%E7%AF%87%EF%BC%89%E5%9C%9F%E6%9C%A8%E4%B9%8B%E5%8F%98%EF%BC%8C%E6%BC%A0%E5%8C%97%E4%B8%BA%E5%9B%9A.mp3",
"cover": ""
},
{
"title": "07、第二部 万国来朝(明代宗朱祁钰篇)知人善任,力挽狂澜",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/mingchao_mp3/%E7%AC%AC%E4%BA%8C%E9%83%A8_%E4%B8%87%E5%9B%BD%E6%9D%A5%E6%9C%9D/7.%20%E6%98%8E%E6%9C%9D%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF%20%5B%E6%9C%89%E5%A3%B0%E4%B9%A6%5D%20%E7%AC%AC%E4%BA%8C%E9%83%A8%20%E4%B8%87%E5%9B%BD%E6%9D%A5%E6%9C%9D%EF%BC%88%E6%98%8E%E4%BB%A3%E5%AE%97%E6%9C%B1%E7%A5%81%E9%92%B0%E7%AF%87%EF%BC%89%E7%9F%A5%E4%BA%BA%E5%96%84%E4%BB%BB%EF%BC%8C%E5%8A%9B%E6%8C%BD%E7%8B%82%E6%BE%9C.mp3",
"cover": ""
},
{
"title": "08、第三部 妖孽宫廷(明英宗朱祁镇篇)夺门之变,赵构之才",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/mingchao_mp3/%E7%AC%AC%E4%B8%89%E9%83%A8_%E5%A6%96%E5%AD%BD%E5%AE%AB%E5%BB%B7/8.%20%E6%98%8E%E6%9C%9D%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF%20%5B%E6%9C%89%E5%A3%B0%E4%B9%A6%5D%20%E7%AC%AC%E4%B8%89%E9%83%A8%20%E5%A6%96%E5%AD%BD%E5%AE%AB%E5%BB%B7%EF%BC%88%E6%98%8E%E8%8B%B1%E5%AE%97%E6%9C%B1%E7%A5%81%E9%95%87%E7%AF%87%EF%BC%89%E5%A4%BA%E9%97%A8%E4%B9%8B%E5%8F%98%EF%BC%8C%E8%B5%B5%E6%9E%84%E4%B9%8B%E6%89%8D.mp3",
"cover": ""
},
{
"title": "09、第三部 妖孽宫廷(明宪宗朱见深篇)拨乱反正",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/mingchao_mp3/%E7%AC%AC%E4%B8%89%E9%83%A8_%E5%A6%96%E5%AD%BD%E5%AE%AB%E5%BB%B7/9.%20%E6%98%8E%E6%9C%9D%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF%20%5B%E6%9C%89%E5%A3%B0%E4%B9%A6%5D%20%E7%AC%AC%E4%B8%89%E9%83%A8%20%E5%A6%96%E5%AD%BD%E5%AE%AB%E5%BB%B7%EF%BC%88%E6%98%8E%E5%AE%AA%E5%AE%97%E6%9C%B1%E8%A7%81%E6%B7%B1%E7%AF%87%EF%BC%89%E6%8B%A8%E4%B9%B1%E5%8F%8D%E6%AD%A3.mp3",
"cover": ""
},
{
"title": "10、第三部 妖孽宫廷(明孝宗朱祐樘篇)勤政爱民,中兴之主",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/mingchao_mp3/%E7%AC%AC%E4%B8%89%E9%83%A8_%E5%A6%96%E5%AD%BD%E5%AE%AB%E5%BB%B7/10.%20%E6%98%8E%E6%9C%9D%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF%20%5B%E6%9C%89%E5%A3%B0%E4%B9%A6%5D%20%E7%AC%AC%E4%B8%89%E9%83%A8%20%E5%A6%96%E5%AD%BD%E5%AE%AB%E5%BB%B7%EF%BC%88%E6%98%8E%E5%AD%9D%E5%AE%97%E6%9C%B1%E7%A5%90%E6%A8%98%E7%AF%87%EF%BC%89%E5%8B%A4%E6%94%BF%E7%88%B1%E6%B0%91%EF%BC%8C%E4%B8%AD%E5%85%B4%E4%B9%8B%E4%B8%BB.mp3",
"cover": ""
},
{
"title": "11、第三部 妖孽宫廷(明武宗朱厚照篇)极具个性,功过参半",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/mingchao_mp3/part3/11.%20%E6%98%8E%E6%9C%9D%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF%20%5B%E6%9C%89%E5%A3%B0%E4%B9%A6%5D%20%E7%AC%AC%E4%B8%89%E9%83%A8%20%E5%A6%96%E5%AD%BD%E5%AE%AB%E5%BB%B7%EF%BC%88%E6%98%8E%E6%AD%A6%E5%AE%97%E6%9C%B1%E5%8E%9A%E7%85%A7%E7%AF%87%EF%BC%89%E6%9E%81%E5%85%B7%E4%B8%AA%E6%80%A7%EF%BC%8C%E5%8A%9F%E8%BF%87%E5%8F%82%E5%8D%8A.mp3",
"cover": ""
},
{
"title": "12、第四部 粉饰太平(明世宗朱厚zen篇)",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/mingchao_mp3/part4/12.%20%E6%98%8E%E6%9C%9D%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF%20%5B%E6%9C%89%E5%A3%B0%E4%B9%A6%5D%20%E7%AC%AC%E5%9B%9B%E9%83%A8%20%E7%B2%89%E9%A5%B0%E5%A4%AA%E5%B9%B3%EF%BC%88%E6%98%8E%E4%B8%96%E5%AE%97%E6%9C%B1%E5%8E%9A%E7%86%9C%E7%AF%87%EF%BC%89.mp3",
"cover": ""
},
{
"title": "13、第五部 帝国飘摇(明世宗朱厚zen篇)",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/mingchao_mp3/%E7%AC%AC%E4%BA%94%E9%83%A8_%E5%B8%9D%E5%9B%BD%E9%A3%98%E6%91%87/13.%20%E6%98%8E%E6%9C%9D%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF%20%5B%E6%9C%89%E5%A3%B0%E4%B9%A6%5D%20%E7%AC%AC%E4%BA%94%E9%83%A8%20%E5%B8%9D%E5%9B%BD%E9%A3%98%E6%91%87%EF%BC%88%E6%98%8E%E4%B8%96%E5%AE%97%E6%9C%B1%E5%8E%9A%E7%86%9C%E7%AF%87%EF%BC%89.mp3",
"cover": ""
},
{
"title": "14、第五部 帝国飘摇(明穆宗朱载井篇)",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/mingchao_mp3/part5/14.%20%E6%98%8E%E6%9C%9D%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF%20%5B%E6%9C%89%E5%A3%B0%E4%B9%A6%5D%20%E7%AC%AC%E4%BA%94%E9%83%A8%20%E5%B8%9D%E5%9B%BD%E9%A3%98%E6%91%87%EF%BC%88%E6%98%8E%E7%A9%86%E5%AE%97%E6%9C%B1%E8%BD%BD%E5%9E%95%E7%AF%87%EF%BC%89.mp3",
"cover": ""
},
{
"title": "15、第五部 帝国飘摇(明神宗朱翊钧篇)",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/mingchao_mp3/part5/15.%20%E6%98%8E%E6%9C%9D%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF%20%5B%E6%9C%89%E5%A3%B0%E4%B9%A6%5D%20%E7%AC%AC%E4%BA%94%E9%83%A8%20%E5%B8%9D%E5%9B%BD%E9%A3%98%E6%91%87%EF%BC%88%E6%98%8E%E7%A5%9E%E5%AE%97%E6%9C%B1%E7%BF%8A%E9%92%A7%E7%AF%87%EF%BC%89.mp3",
"cover": ""
},
{
"title": "16、第六部 日暮西山(明神宗朱翊钧篇)",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/mingchao_mp3/part6/16.%20%E6%98%8E%E6%9C%9D%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF%20%5B%E6%9C%89%E5%A3%B0%E4%B9%A6%5D%20%E7%AC%AC%E5%85%AD%E9%83%A8%20%E6%97%A5%E6%9A%AE%E8%A5%BF%E5%B1%B1%EF%BC%88%E6%98%8E%E7%A5%9E%E5%AE%97%E6%9C%B1%E7%BF%8A%E9%92%A7%E7%AF%87%EF%BC%89.mp3",
"cover": ""
},
{
"title": "17、第六部 日暮西山(明光宗朱常洛篇)生因意外,死更荒唐",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/mingchao_mp3/part6/17.%20%E6%98%8E%E6%9C%9D%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF%20%5B%E6%9C%89%E5%A3%B0%E4%B9%A6%5D%20%E7%AC%AC%E5%85%AD%E9%83%A8%20%E6%97%A5%E6%9A%AE%E8%A5%BF%E5%B1%B1%EF%BC%88%E6%98%8E%E5%85%89%E5%AE%97%E6%9C%B1%E5%B8%B8%E6%B4%9B%E7%AF%87%EF%BC%89%E7%94%9F%E5%9B%A0%E6%84%8F%E5%A4%96%EF%BC%8C%E6%AD%BB%E6%9B%B4%E8%8D%92%E5%94%90.mp3",
"cover": ""
},
{
"title": "18、第六部 日暮西山(明熹宗朱由校篇)木匠皇帝",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/mingchao_mp3/part6/18.%20%E6%98%8E%E6%9C%9D%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF%20%5B%E6%9C%89%E5%A3%B0%E4%B9%A6%5D%20%E7%AC%AC%E5%85%AD%E9%83%A8%20%E6%97%A5%E6%9A%AE%E8%A5%BF%E5%B1%B1%EF%BC%88%E6%98%8E%E7%86%B9%E5%AE%97%E6%9C%B1%E7%94%B1%E6%A0%A1%E7%AF%87%EF%BC%89%E6%9C%A8%E5%8C%A0%E7%9A%87%E5%B8%9D.mp3",
"cover": ""
},
{
"title": "19、第七部 大结局(明熹宗朱由校篇)木匠皇帝",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/mingchao_mp3/part7/19.%20%E6%98%8E%E6%9C%9D%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF%20%5B%E6%9C%89%E5%A3%B0%E4%B9%A6%5D%20%E7%AC%AC%E4%B8%83%E9%83%A8%20%E5%A4%A7%E7%BB%93%E5%B1%80%EF%BC%88%E6%98%8E%E7%86%B9%E5%AE%97%E6%9C%B1%E7%94%B1%E6%A0%A1%E7%AF%87%EF%BC%89%E6%9C%A8%E5%8C%A0%E7%9A%87%E5%B8%9D.mp3",
"cover": ""
},
{
"title": "20、第七部 大结局(明思宗朱由检篇 - 上)",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/mingchao_mp3/part7/20.%20%E6%98%8E%E6%9C%9D%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF%20%5B%E6%9C%89%E5%A3%B0%E4%B9%A6%5D%20%E7%AC%AC%E4%B8%83%E9%83%A8%20%E5%A4%A7%E7%BB%93%E5%B1%80%EF%BC%88%E6%98%8E%E6%80%9D%E5%AE%97%E6%9C%B1%E7%94%B1%E6%A3%80%E7%AF%87%20-%20%E4%B8%8A%EF%BC%89.mp3",
"cover": ""
},
{
"title": "21、第七部 大结局(明思宗朱由检篇 - 下)全书完",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/mingchao_mp3/part7/21.%20%E6%98%8E%E6%9C%9D%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF%20%5B%E6%9C%89%E5%A3%B0%E4%B9%A6%5D%20%E7%AC%AC%E4%B8%83%E9%83%A8%20%E5%A4%A7%E7%BB%93%E5%B1%80%EF%BC%88%E6%98%8E%E6%80%9D%E5%AE%97%E6%9C%B1%E7%94%B1%E6%A3%80%E7%AF%87%20-%20%E4%B8%8B%EF%BC%89%E5%85%A8%E4%B9%A6%E5%AE%8C.mp3",
"cover": ""
}
]
+236
View File
@@ -0,0 +1,236 @@
[
{
"title": "如果我很平庸",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/1_%E5%A6%82%E6%9E%9C%E6%88%91%E5%BE%88%E5%B9%B3%E5%BA%B8.mp3",
"cover": ""
},
{
"title": "很久很久",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/2_%E5%BE%88%E4%B9%85%E5%BE%88%E4%B9%85.mp3",
"cover": ""
},
{
"title": "貴得可以",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/3_%E8%B2%B4%E5%BE%97%E5%8F%AF%E4%BB%A5.mp3",
"cover": ""
},
{
"title": "如煙 Live",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/4_%E5%A6%82%E7%85%99%20Live.mp3",
"cover": ""
},
{
"title": "背光的角色",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/5_%E8%83%8C%E5%85%89%E7%9A%84%E8%A7%92%E8%89%B2.mp3",
"cover": ""
},
{
"title": "有你有我",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/6_%E6%9C%89%E4%BD%A0%E6%9C%89%E6%88%91.mp3",
"cover": ""
},
{
"title": "離開我的依賴",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/7_%E9%9B%A2%E9%96%8B%E6%88%91%E7%9A%84%E4%BE%9D%E8%B3%B4.mp3",
"cover": ""
},
{
"title": "浪人的",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/8_%E6%B5%AA%E4%BA%BA%E7%9A%84.mp3",
"cover": ""
},
{
"title": "缺席",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/9_%E7%BC%BA%E5%B8%AD.mp3",
"cover": ""
},
{
"title": "太陽與地球",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/10_%E5%A4%AA%E9%99%BD%E8%88%87%E5%9C%B0%E7%90%83.mp3",
"cover": ""
},
{
"title": "玻璃",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/11_%E7%8E%BB%E7%92%83.mp3",
"cover": ""
},
{
"title": "以我為名",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/12_%E4%BB%A5%E6%88%91%E7%82%BA%E5%90%8D.mp3",
"cover": ""
},
{
"title": "原我離開",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/13_%E5%8E%9F%E6%88%91%E9%9B%A2%E9%96%8B.mp3",
"cover": ""
},
{
"title": "我甘願重新愛過",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/14_%E6%88%91%E7%94%98%E9%A1%98%E9%87%8D%E6%96%B0%E6%84%9B%E9%81%8E.mp3",
"cover": ""
},
{
"title": "那天下雨了",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/15_%E9%82%A3%E5%A4%A9%E4%B8%8B%E9%9B%A8%E4%BA%86.mp3",
"cover": ""
},
{
"title": "愛琴海",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/16_%E6%84%9B%E7%90%B4%E6%B5%B7.mp3",
"cover": ""
},
{
"title": "誰稀罕",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/17_%E8%AA%B0%E7%A8%80%E7%BD%95.mp3",
"cover": ""
},
{
"title": "開始懂了",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/18_%E9%96%8B%E5%A7%8B%E6%87%82%E4%BA%86.mp3",
"cover": ""
},
{
"title": "CEREMONY",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/19_CEREMONY.mp3",
"cover": ""
},
{
"title": "我對緣分小心翼翼",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/20_%E6%88%91%E5%B0%8D%E7%B7%A3%E5%88%86%E5%B0%8F%E5%BF%83%E7%BF%BC%E7%BF%BC.mp3",
"cover": ""
},
{
"title": "搬家",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/21_%E6%90%AC%E5%AE%B6.mp3",
"cover": ""
},
{
"title": "villain",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/22_villain.mp3",
"cover": ""
},
{
"title": "Golden Boy",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/23_Golden%20Boy.mp3",
"cover": ""
},
{
"title": "Foolish Things",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/24_Foolish%20Things.mp3",
"cover": ""
},
{
"title": "IS THIS LOVE ",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/25_IS%20THIS%20LOVE_.mp3",
"cover": ""
},
{
"title": "Bunch Of Idiots",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/26_Bunch%20Of%20Idiots.mp3",
"cover": ""
},
{
"title": "給我一槍",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/29_%E7%B5%A6%E6%88%91%E4%B8%80%E6%A7%8D.mp3",
"cover": ""
},
{
"title": "等你等我",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/31_%E7%AD%89%E4%BD%A0%E7%AD%89%E6%88%91.mp3",
"cover": ""
},
{
"title": "Alive",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/32_Alive.mp3",
"cover": ""
},
{
"title": "幸福在歌唱",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/34_%E5%B9%B8%E7%A6%8F%E5%9C%A8%E6%AD%8C%E5%94%B1.mp3",
"cover": ""
},
{
"title": "跳樓機",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/35_%E8%B7%B3%E6%A8%93%E6%A9%9F.mp3",
"cover": ""
},
{
"title": "I Do",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/37_I%20Do.mp3",
"cover": ""
},
{
"title": "太陽之子",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/38_%E5%A4%AA%E9%99%BD%E4%B9%8B%E5%AD%90.mp3",
"cover": ""
},
{
"title": "陪你到這",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/43_%E9%99%AA%E4%BD%A0%E5%88%B0%E9%80%99.mp3",
"cover": ""
},
{
"title": "海屿你",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/44_%E6%B5%B7%E5%B1%BF%E4%BD%A0.mp3",
"cover": ""
},
{
"title": "LEMONADE",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/45_LEMONADE.mp3",
"cover": ""
},
{
"title": "Home",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/46_Home.mp3",
"cover": ""
},
{
"title": "What if the Sky is not the Limit",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/49_What%20if%20the%20Sky%20is%20not%20the%20Limit.mp3",
"cover": ""
},
{
"title": "When She Holds Me Right",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/50_When%20She%20Holds%20Me%20Right.mp3",
"cover": ""
}
]
@@ -0,0 +1,236 @@
[
{
"title": "如果我很平庸",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/1_%E5%A6%82%E6%9E%9C%E6%88%91%E5%BE%88%E5%B9%B3%E5%BA%B8.mp3",
"cover": ""
},
{
"title": "很久很久",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/2_%E5%BE%88%E4%B9%85%E5%BE%88%E4%B9%85.mp3",
"cover": ""
},
{
"title": "貴得可以",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/3_%E8%B2%B4%E5%BE%97%E5%8F%AF%E4%BB%A5.mp3",
"cover": ""
},
{
"title": "如煙 Live",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/4_%E5%A6%82%E7%85%99%20Live.mp3",
"cover": ""
},
{
"title": "背光的角色",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/5_%E8%83%8C%E5%85%89%E7%9A%84%E8%A7%92%E8%89%B2.mp3",
"cover": ""
},
{
"title": "有你有我",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/6_%E6%9C%89%E4%BD%A0%E6%9C%89%E6%88%91.mp3",
"cover": ""
},
{
"title": "離開我的依賴",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/7_%E9%9B%A2%E9%96%8B%E6%88%91%E7%9A%84%E4%BE%9D%E8%B3%B4.mp3",
"cover": ""
},
{
"title": "浪人的",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/8_%E6%B5%AA%E4%BA%BA%E7%9A%84.mp3",
"cover": ""
},
{
"title": "缺席",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/9_%E7%BC%BA%E5%B8%AD.mp3",
"cover": ""
},
{
"title": "太陽與地球",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/10_%E5%A4%AA%E9%99%BD%E8%88%87%E5%9C%B0%E7%90%83.mp3",
"cover": ""
},
{
"title": "玻璃",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/11_%E7%8E%BB%E7%92%83.mp3",
"cover": ""
},
{
"title": "以我為名",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/12_%E4%BB%A5%E6%88%91%E7%82%BA%E5%90%8D.mp3",
"cover": ""
},
{
"title": "原我離開",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/13_%E5%8E%9F%E6%88%91%E9%9B%A2%E9%96%8B.mp3",
"cover": ""
},
{
"title": "我甘願重新愛過",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/14_%E6%88%91%E7%94%98%E9%A1%98%E9%87%8D%E6%96%B0%E6%84%9B%E9%81%8E.mp3",
"cover": ""
},
{
"title": "那天下雨了",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/15_%E9%82%A3%E5%A4%A9%E4%B8%8B%E9%9B%A8%E4%BA%86.mp3",
"cover": ""
},
{
"title": "愛琴海",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/16_%E6%84%9B%E7%90%B4%E6%B5%B7.mp3",
"cover": ""
},
{
"title": "誰稀罕",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/17_%E8%AA%B0%E7%A8%80%E7%BD%95.mp3",
"cover": ""
},
{
"title": "開始懂了",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/18_%E9%96%8B%E5%A7%8B%E6%87%82%E4%BA%86.mp3",
"cover": ""
},
{
"title": "CEREMONY",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/19_CEREMONY.mp3",
"cover": ""
},
{
"title": "我對緣分小心翼翼",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/20_%E6%88%91%E5%B0%8D%E7%B7%A3%E5%88%86%E5%B0%8F%E5%BF%83%E7%BF%BC%E7%BF%BC.mp3",
"cover": ""
},
{
"title": "搬家",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/21_%E6%90%AC%E5%AE%B6.mp3",
"cover": ""
},
{
"title": "villain",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/22_villain.mp3",
"cover": ""
},
{
"title": "Golden Boy",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/23_Golden%20Boy.mp3",
"cover": ""
},
{
"title": "Foolish Things",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/24_Foolish%20Things.mp3",
"cover": ""
},
{
"title": "IS THIS LOVE ",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/25_IS%20THIS%20LOVE_.mp3",
"cover": ""
},
{
"title": "Bunch Of Idiots",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/26_Bunch%20Of%20Idiots.mp3",
"cover": ""
},
{
"title": "給我一槍",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/29_%E7%B5%A6%E6%88%91%E4%B8%80%E6%A7%8D.mp3",
"cover": ""
},
{
"title": "等你等我",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/31_%E7%AD%89%E4%BD%A0%E7%AD%89%E6%88%91.mp3",
"cover": ""
},
{
"title": "Alive",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/32_Alive.mp3",
"cover": ""
},
{
"title": "幸福在歌唱",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/34_%E5%B9%B8%E7%A6%8F%E5%9C%A8%E6%AD%8C%E5%94%B1.mp3",
"cover": ""
},
{
"title": "跳樓機",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/35_%E8%B7%B3%E6%A8%93%E6%A9%9F.mp3",
"cover": ""
},
{
"title": "I Do",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/37_I%20Do.mp3",
"cover": ""
},
{
"title": "太陽之子",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/38_%E5%A4%AA%E9%99%BD%E4%B9%8B%E5%AD%90.mp3",
"cover": ""
},
{
"title": "陪你到這",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/43_%E9%99%AA%E4%BD%A0%E5%88%B0%E9%80%99.mp3",
"cover": ""
},
{
"title": "海屿你",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/44_%E6%B5%B7%E5%B1%BF%E4%BD%A0.mp3",
"cover": ""
},
{
"title": "LEMONADE",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/45_LEMONADE.mp3",
"cover": ""
},
{
"title": "Home",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/46_Home.mp3",
"cover": ""
},
{
"title": "What if the Sky is not the Limit",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/49_What%20if%20the%20Sky%20is%20not%20the%20Limit.mp3",
"cover": ""
},
{
"title": "When She Holds Me Right",
"artist": "",
"src": "https://android-o1-images.oss-accelerate.aliyuncs.com/550e8400-e29b-41d4-a716-446655442082/external_storage/2026_taiwan_top50_mp3/50_When%20She%20Holds%20Me%20Right.mp3",
"cover": ""
}
]