<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
>
<channel>
<title><![CDATA[skydata天空数据]]></title> 
<atom:link href="http://yy.skydata.fun:18080/rss.php" rel="self" type="application/rss+xml" />
<description><![CDATA[]]></description>
<link>http://yy.skydata.fun:18080/</link>
<language>zh-cn</language>
<generator>www.emlog.net</generator>
<item>
    <title>OpenWrt 部署 OpenVPN 客户端完整教程</title>
    <link>http://yy.skydata.fun:18080/?post=11</link>
    <description><![CDATA[<pre><code class="language-markdown"># OpenWrt 部署 OpenVPN 客户端完整教程

## 环境说明

| 项目 | 信息 |
|------|------|
| 路由器 | Xiaomi Mi Router 4A Gigabit Edition |
| 架构 | MediaTek MT7621 |
| 固件 | LEDE R25.8.8 / OpenWrt 23.05 |

---

## 一、安装 OpenVPN

```bash
opkg update
opkg install openvpn-openssl
opkg install luci-app-openvpn</code></pre>
<hr />
<h2>二、创建配置文件</h2>
<h3>2.1 创建客户端配置</h3>
<pre><code class="language-bash">cat &gt; /etc/openvpn/client.ovpn &lt;&lt; 'EOF'
client
dev-type tun
dev tun0
proto tcp
tun-mtu 1400
cipher AES-256-GCM
comp-lzo
remote 你的服务器地址 端口
resolv-retry infinite
nobind
persist-key
persist-tun
verb 3
auth-user-pass /etc/openvpn/auth.txt
script-security 2

&lt;ca&gt;
-----BEGIN CERTIFICATE-----
你的CA证书内容
-----END CERTIFICATE-----
&lt;/ca&gt;
EOF</code></pre>
<h3>2.2 创建认证文件</h3>
<pre><code class="language-bash">echo "你的用户名" &gt; /etc/openvpn/auth.txt
echo "你的密码" &gt;&gt; /etc/openvpn/auth.txt
chmod 600 /etc/openvpn/auth.txt</code></pre>
<hr />
<h2>三、启动并测试</h2>
<pre><code class="language-bash"># 后台启动
openvpn --config /etc/openvpn/client.ovpn --daemon --log /tmp/openvpn.log

# 检查是否成功
sleep 3
ip addr show tun0</code></pre>
<p>看到 <code>inet 10.x.x.x</code> 表示成功。</p>
<hr />
<h2>四、添加路由（按需修改）</h2>
<pre><code class="language-bash"># 添加你的目标网段
ip route add 192.168.4.0/24 dev tun0
ip route add 192.168.5.0/24 dev tun0
ip route add 192.168.6.0/24 dev tun0
ip route add 192.168.7.0/24 dev tun0

# 验证
ip route show | grep tun0</code></pre>
<hr />
<h2>五、配置防火墙</h2>
<pre><code class="language-bash"># 创建VPN区域
uci add firewall zone
uci set firewall.@zone[-1].name='vpn'
uci set firewall.@zone[-1].input='REJECT'
uci set firewall.@zone[-1].output='ACCEPT'
uci set firewall.@zone[-1].forward='REJECT'
uci set firewall.@zone[-1].masq='1'
uci set firewall.@zone[-1].device='tun0'

# 允许LAN到VPN
uci add firewall forwarding
uci set firewall.@forwarding[-1].src='lan'
uci set firewall.@forwarding[-1].dest='vpn'

uci commit firewall
/etc/init.d/firewall restart</code></pre>
<hr />
<h2>六、设置永久生效</h2>
<h3>6.1 开机自启</h3>
<pre><code class="language-bash">/etc/init.d/openvpn enable</code></pre>
<h3>6.2 开机自动添加路由</h3>
<pre><code class="language-bash">cat &gt; /etc/rc.local &lt;&lt; 'EOF'
#!/bin/sh
sleep 10
ip route add 192.168.4.0/24 dev tun0
ip route add 192.168.5.0/24 dev tun0
ip route add 192.168.6.0/24 dev tun0
ip route add 192.168.7.0/24 dev tun0
exit 0
EOF

chmod +x /etc/rc.local</code></pre>
<h3>6.3 添加防火墙规则（持久化）</h3>
<pre><code class="language-bash">cat &gt;&gt; /etc/firewall.user &lt;&lt; 'EOF'

# VPN forward rules
iptables -I FORWARD -i br-lan -o tun0 -j ACCEPT
iptables -I FORWARD -i tun0 -o br-lan -j ACCEPT
EOF</code></pre>
<hr />
<h2>七、验证</h2>
<pre><code class="language-bash">ps | grep openvpn | grep -v grep
ip addr show tun0
ip route show | grep tun0
ping -c 2 10.7.7.1</code></pre>
<hr />
<h2>八、重启测试</h2>
<pre><code class="language-bash">reboot</code></pre>
<p>重启后重新登录，执行验证命令确认一切正常。</p>
<hr />
<h2>九、常用命令</h2>
<table>
<thead>
<tr>
<th>用途</th>
<th>命令</th>
</tr>
</thead>
<tbody>
<tr>
<td>查看日志</td>
<td><code>cat /tmp/openvpn.log</code></td>
</tr>
<tr>
<td>重启VPN</td>
<td><code>/etc/init.d/openvpn restart</code></td>
</tr>
<tr>
<td>停止VPN</td>
<td><code>/etc/init.d/openvpn stop</code></td>
</tr>
<tr>
<td>启动VPN</td>
<td><code>/etc/init.d/openvpn start</code></td>
</tr>
<tr>
<td>添加路由</td>
<td><code>ip route add 网段 dev tun0</code></td>
</tr>
<tr>
<td>删除路由</td>
<td><code>ip route del 网段 dev tun0</code></td>
</tr>
</tbody>
</table>
<hr />
<h2>十、配置文件位置</h2>
<table>
<thead>
<tr>
<th>文件</th>
<th>用途</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>/etc/openvpn/client.ovpn</code></td>
<td>VPN配置</td>
</tr>
<tr>
<td><code>/etc/openvpn/auth.txt</code></td>
<td>用户名密码</td>
</tr>
<tr>
<td><code>/etc/rc.local</code></td>
<td>开机路由</td>
</tr>
<tr>
<td><code>/etc/firewall.user</code></td>
<td>防火墙规则</td>
</tr>
<tr>
<td><code>/tmp/openvpn.log</code></td>
<td>运行日志</td>
</tr>
</tbody>
</table>
<hr />
<p><strong>教程结束</strong></p>]]></description>
    <pubDate>Tue, 07 Apr 2026 16:57:01 +0800</pubDate>
    <dc:creator>Liu_Yao</dc:creator>
    <guid>http://yy.skydata.fun:18080/?post=11</guid>
</item>
<item>
    <title>Termix 群晖图形化部署教程</title>
    <link>http://yy.skydata.fun:18080/?post=10</link>
    <description><![CDATA[<h1>群晖 NAS 图形化部署 Termix 精简版教程</h1>
<h2>一、准备工作</h2>
<ul>
<li>DSM 7.2+（Container Manager）</li>
<li>端口 8033 未占用</li>
<li>管理员权限</li>
</ul>
<hr />
<h2>二、创建目录与配置</h2>
<ol>
<li><strong>File Station</strong> 中创建：<code>/docker/termix/termix-data</code></li>
<li>在 <code>termix</code> 文件夹新建 <code>docker-compose.yml</code>，粘贴：
<pre><code class="language-yaml">version: '3.8'
services:
  termix:
    image: ghcr.io/lukegus/termix:latest
    container_name: termix
    restart: unless-stopped
    ports:
      - "8033:8080"
    volumes:
      - ./termix-data:/app/data
    environment:
      - PORT=8080
      - TZ=Asia/Shanghai
    user: "0:0"</code></pre></li>
</ol>
<hr />
<h2>三、部署容器</h2>
<ol>
<li>打开 <strong>Container Manager → 项目 → 新增</strong></li>
<li>项目名：<code>termix</code>，路径：<code>/docker/termix</code></li>
<li>来源：使用现有 <code>docker-compose.yml</code></li>
<li>下一步 → 完成，等待状态变为「运行中」</li>
</ol>
<hr />
<h2>四、访问与配置</h2>
<ul>
<li>访问：<code>http://群晖IP:8033</code></li>
<li>首次注册即管理员</li>
<li>安全设置：登录后 → 用户名 → Admin Settings → 关闭 <code>Allow new account registration</code></li>
<li>添加服务器：Host Manager → Add Host，填写服务器 SSH 信息</li>
</ul>
<hr />
<h2>五、常见问题</h2>
<ul>
<li><strong>端口被占用</strong>：修改 <code>docker-compose.yml</code> 左侧端口（如 8034），重建项目</li>
<li><strong>权限错误</strong>：确认配置中 <code>user: "0:0"</code> 已存在</li>
<li><strong>无法访问</strong>：检查容器状态是否为「运行中」</li>
</ul>
<hr />
<h2>六、卸载</h2>
<p>Container Manager → 项目 → 删除 <code>termix</code>（勾选删除容器/镜像），可删除 <code>/docker/termix</code> 文件夹</p>
<hr />]]></description>
    <pubDate>Tue, 17 Mar 2026 12:53:38 +0800</pubDate>
    <dc:creator>Liu_Yao</dc:creator>
    <guid>http://yy.skydata.fun:18080/?post=10</guid>
</item>
<item>
    <title>飞牛 NAS（ARM 架构）OpenVPN 客户端 一次部署成功教程</title>
    <link>http://yy.skydata.fun:18080/?post=9</link>
    <description><![CDATA[<h1>飞牛NAS（ARM架构）OpenVPN客户端 一次部署成功教程</h1>
<blockquote>
<p>基于实际验证的正确流程，剔除所有错误步骤，适配ARM架构飞牛NAS，可直接复制执行</p>
</blockquote>
<h2>一、前置准备</h2>
<ol>
<li>飞牛NAS已开启SSH（后台 → 网络 → SSH）</li>
<li>电脑与NAS处于同一局域网</li>
<li>准备好：OpenVPN账号、密码（需替换教程中占位符）</li>
</ol>
<h2>二、SSH连接飞牛NAS</h2>
<pre><code class="language-bash">ssh 你的NAS用户名@NAS局域网IP
# 示例：ssh admin@192.168.1.100</code></pre>
<h2>三、安装OpenVPN（ARM架构兼容版）</h2>
<pre><code class="language-bash">sudo apt update
sudo apt install openvpn -y</code></pre>
<h2>四、创建配置目录</h2>
<pre><code class="language-bash">sudo mkdir -p /etc/openvpn/client</code></pre>
<h2>五、创建OpenVPN核心配置文件</h2>
<pre><code class="language-bash">sudo nano /etc/openvpn/client.conf</code></pre>
<p>证书请在服务端生成（生成后把他丢给豆包配置）：</p>
<pre><code>client
dev-type tun
dev tunx
proto tcp
tun-mtu 1400
cipher AES-256-GCM
remote 你的域名或ip 1194
resolv-retry infinite
nobind
persist-key
persist-tun
verb 3
auth-user-pass /etc/openvpn/client/auth.txt
script-security 2

&lt;ca&gt;
-----BEGIN CERTIFICATE-----
你的证书
-----END CERTIFICATE-----
&lt;/ca&gt;</code></pre>
<p>保存并退出：<code>Ctrl+O</code> → 回车确认 → <code>Ctrl+X</code></p>
<h2>六、创建账号密码自动登录文件</h2>
<pre><code class="language-bash">sudo nano /etc/openvpn/client/auth.txt</code></pre>
<p>粘贴以下内容（替换为你的实际账号密码）：</p>
<pre><code>你的VPN用户名
你的VPN密码</code></pre>
<p>保存并退出：<code>Ctrl+O</code> → 回车确认 → <code>Ctrl+X</code></p>
<h2>七、设置文件安全权限（必须步骤）</h2>
<pre><code class="language-bash">sudo chmod 600 /etc/openvpn/client.conf
sudo chmod 600 /etc/openvpn/client/auth.txt
sudo chown root:root /etc/openvpn/* -R</code></pre>
<h2>八、创建systemd服务（实现开机自启）</h2>
<pre><code class="language-bash">sudo nano /etc/systemd/system/openvpn-myclient.service</code></pre>
<p>粘贴以下内容：</p>
<pre><code class="language-ini">[Unit]
Description=OpenVPN Client (myclient)
After=network.target

[Service]
Type=simple
ExecStart=/usr/sbin/openvpn --config /etc/openvpn/client.conf
Restart=on-failure
User=root
Group=root

[Install]
WantedBy=multi-user.target</code></pre>
<p>保存并退出：<code>Ctrl+O</code> → 回车确认 → <code>Ctrl+X</code></p>
<h2>九、启动服务并设置开机自启</h2>
<pre><code class="language-bash">sudo systemctl daemon-reload
sudo systemctl enable --now openvpn-myclient</code></pre>
<h2>十、验证部署结果</h2>
<h3>1. 检查服务运行状态</h3>
<pre><code class="language-bash">sudo systemctl status openvpn-myclient</code></pre>
<p>✅ 成功标志：</p>
<ul>
<li>显示 <code>active (running)</code></li>
<li>日志中出现 <code>Initialization Sequence Completed</code></li>
</ul>
<h3>2. 验证内网连通性</h3>
<pre><code class="language-bash">sudo ping 10.7.7.1 -I tunx -c 3</code></pre>
<p>✅ 成功标志：收到ICMP回复包</p>
<h3>3. 检查开机自启状态</h3>
<pre><code class="language-bash">sudo systemctl is-enabled openvpn-myclient</code></pre>
<p>✅ 成功标志：输出 <code>enabled</code></p>
<h2>十一、常用管理命令</h2>
<table>
<thead>
<tr>
<th>操作</th>
<th>命令</th>
</tr>
</thead>
<tbody>
<tr>
<td>启动VPN</td>
<td><code>sudo systemctl start openvpn-myclient</code></td>
</tr>
<tr>
<td>停止VPN</td>
<td><code>sudo systemctl stop openvpn-myclient</code></td>
</tr>
<tr>
<td>重启VPN</td>
<td><code>sudo systemctl restart openvpn-myclient</code></td>
</tr>
<tr>
<td>查看实时日志</td>
<td><code>sudo journalctl -u openvpn-myclient -f</code></td>
</tr>
</tbody>
</table>
<h2>十二、飞牛NAS Web界面查看状态</h2>
<ol>
<li>登录飞牛NAS后台（浏览器访问NAS IP）</li>
<li>系统 → 进程管理 → 搜索 <code>openvpn</code>，可看到运行中的进程</li>
<li>网络 → 接口信息 → 查看 <code>tunx</code> 网卡（状态为UP且有内网IP）</li>
<li>可选：安装Web终端插件，直接执行上述验证命令</li>
</ol>
<h3>总结</h3>
<ol>
<li>✅ 本教程为ARM架构飞牛NAS定制，剔除所有错误路径/命令，可直接复制执行</li>
<li>✅ 核心成功点：正确的配置文件路径、严格的权限设置、适配的systemd服务</li>
<li>✅ 部署完成后自动实现开机自启、账号密码自动登录，无需手动干预</li>
</ol>]]></description>
    <pubDate>Sat, 14 Mar 2026 19:56:04 +0800</pubDate>
    <dc:creator>Liu_Yao</dc:creator>
    <guid>http://yy.skydata.fun:18080/?post=9</guid>
</item>
<item>
    <title>PVE 垃圾回收 (GC) 进程 CPU 占用过高问题解决教程</title>
    <link>http://yy.skydata.fun:18080/?post=8</link>
    <description><![CDATA[<h1>PVE 垃圾回收 (GC) 进程 CPU 占用过高问题解决教程</h1>
<h2>📋 问题现象</h2>
<ul>
<li>PVE 宿主机 CPU 长期居高不下（60%+）</li>
<li><code>top</code> 命令看到 <code>.pve-gc</code> 进程占用 190%-210% CPU</li>
<li>进程被杀死后会自动重启，PID 不断变化</li>
</ul>
<hr />
<h2>🔍 第一步：确认问题</h2>
<pre><code class="language-bash">top -b -n 1 | head -20</code></pre>
<hr />
<h2>🛑 第二步：立即临时处理</h2>
<pre><code class="language-bash">kill -9 $(pgrep -f "\.pve-gc") 2&gt;/dev/null</code></pre>
<hr />
<h2>⏰ 第三步：禁用自动触发定时器</h2>
<pre><code class="language-bash">systemctl stop pve-daily-update.timer
systemctl disable pve-daily-update.timer
systemctl status pve-daily-update.timer</code></pre>
<hr />
<h2>📁 第四步：找到 GC 可执行文件</h2>
<pre><code class="language-bash">find / -name "*pve-gc*" 2&gt;/dev/null</code></pre>
<hr />
<h2>🔒 第五步：彻底锁死 GC 文件</h2>
<pre><code class="language-bash"># 5.1 杀死当前GC进程
kill -9 $(pgrep -f "\.pve-gc") 2&gt;/dev/null

# 5.2 覆盖文件内容为空脚本
echo '#!/bin/bash' &gt; /var/lib/pve/.cache/.pve-gc
echo 'exit 0' &gt;&gt; /var/lib/pve/.cache/.pve-gc

# 5.3 移除执行权限
chmod 000 /var/lib/pve/.cache/.pve-gc

# 5.4 加锁防止被修改
chattr +i /var/lib/pve/.cache/.pve-gc

# 5.5 验证
ls -la /var/lib/pve/.cache/.pve-gc
lsattr /var/lib/pve/.cache/.pve-gc</code></pre>
<hr />
<h2>🛡️ 第六步：创建 CPU 限制脚本（可选）</h2>
<pre><code class="language-bash">cat &gt; /usr/local/bin/limit-gc.sh &lt;&lt; 'EOF'
#!/bin/bash
mkdir -p /sys/fs/cgroup/cpu/gc-limiter 2&gt;/dev/null
echo 10000 &gt; /sys/fs/cgroup/cpu/gc-limiter/cpu.cfs_quota_us 2&gt;/dev/null
echo 100000 &gt; /sys/fs/cgroup/cpu/gc-limiter/cpu.cfs_period_us 2&gt;/dev/null

while true; do
    ps aux | grep "\.pve-gc" | grep -v grep | awk '{print $2}' | while read pid; do
        if [ ! -z "$pid" ]; then
            echo $pid &gt; /sys/fs/cgroup/cpu/gc-limiter/cgroup.procs 2&gt;/dev/null
            echo "$(date): 已限制GC进程 PID=$pid" &gt;&gt; /var/log/gc-limited.log
        fi
    done
    sleep 2
done
EOF

chmod +x /usr/local/bin/limit-gc.sh</code></pre>
<hr />
<h2>🔄 第七步：设置开机自启（可选）</h2>
<pre><code class="language-bash">echo '/usr/local/bin/limit-gc.sh &amp;' &gt;&gt; /etc/rc.local
chmod +x /etc/rc.local
tail -n 5 /etc/rc.local</code></pre>
<hr />
<h2>🚀 第八步：立即启动限制脚本（可选）</h2>
<pre><code class="language-bash">nohup /usr/local/bin/limit-gc.sh &gt;/dev/null 2&gt;&amp;1 &amp;
ps aux | grep limit-gc.sh</code></pre>
<hr />
<h2>✅ 第九步：最终验证</h2>
<pre><code class="language-bash">top -b -n 1 | head -10
ps aux | grep "\.pve-gc" | grep -v grep</code></pre>
<hr />
<h2>📊 常用验证命令汇总</h2>
<pre><code class="language-bash"># 查看CPU
top -b -n 1 | head -10

# 查看GC进程
ps aux | grep "\.pve-gc" | grep -v grep

# 查看GC文件状态
ls -la /var/lib/pve/.cache/.pve-gc
lsattr /var/lib/pve/.cache/.pve-gc

# 查看定时器状态
systemctl status pve-daily-update.timer

# 查看限制脚本日志
tail -f /var/log/gc-limited.log</code></pre>
<hr />
<h2>✅ 完成标准</h2>
<ul>
<li>[ ] CPU 利用率 &lt; 10%</li>
<li>[ ] 没有 <code>.pve-gc</code> 进程</li>
<li>[ ] GC 文件权限为 <code>000</code>，属性为 <code>+i</code></li>
<li>[ ] 系统负载平稳</li>
</ul>
<hr />
<h2>⚠️ 注意事项</h2>
<ol>
<li><strong>第五步是核心</strong>：锁死 GC 文件后它就永远无法执行</li>
<li><strong>重启后依然有效</strong>：文件锁和权限永久保留</li>
<li><strong>定时器禁用</strong>：防止每天自动触发</li>
<li><strong>双重保险</strong>：文件锁死 + 限制脚本（可选）</li>
</ol>]]></description>
    <pubDate>Sat, 14 Mar 2026 19:52:03 +0800</pubDate>
    <dc:creator>Liu_Yao</dc:creator>
    <guid>http://yy.skydata.fun:18080/?post=8</guid>
</item>
<item>
    <title>爱快Docker部署frps</title>
    <link>http://yy.skydata.fun:18080/?post=7</link>
    <description><![CDATA[<h2>第1步：基本信息</h2>
<pre><code class="language-bash">容器名称：frps
内存占用(M)：256  （建议256-512）
选择镜像文件：snowdreamtech/frps:latest
选择网络接口：bridge（默认docker网络）
IPv4地址：留空（DHCP自动分配）
开机自启：✓ 勾选</code></pre>
<h2>第2步：高级设置 → 挂载目录</h2>
<pre><code class="language-bash">点击"添加" → 选择"文件管理"
源路径：/mnt/docker/frps
目标路径：/etc/frp
权限：读写</code></pre>
<h2>第3步：环境变量</h2>
<p>点击&quot;添加&quot;按钮：</p>
<pre><code class="language-bash">变量名：TZ
值：Asia/Shanghai</code></pre>
<h2>第4步：启动命令（关键！）</h2>
<p>在&quot;启动命令&quot;框中输入：</p>
<pre><code class="language-bash">bash
/bin/sh
-c
"frps -c /etc/frp/frps.toml"</code></pre>
<h2>第5步：创建配置文件</h2>
<p>在爱快文件管理中：</p>
<pre><code class="language-bash">1. 进入 /mnt/docker/
2. 创建文件夹 frps
3. 在frps文件夹中创建文件 frps.toml</code></pre>
<h2>第6步：配置文件内容</h2>
<p>/mnt/docker/frps/frps.toml：</p>
<pre><code class="language-bash">bindPort = 7000

# 管理面板
webServer.port = 7500
webServer.user = "admin"
webServer.password = "admin123"

# 认证
auth.method = "token"
auth.token = "ikuai2024"

# 日志
log.to = "/etc/frp/frps.log"
log.level = "info"
log.maxDays = 3

# 连接设置
transport.tcpMux = true
transport.maxPoolCount = 50</code></pre>
<h2>第7步：在爱快中设置端口转发</h2>
<pre><code class="language-bash">网络设置 → 端口映射 → 添加</code></pre>
<p>需要添加：</p>
<pre><code class="language-bash">规则1：
外网端口：7000 → 内网IP：[容器IP] → 内网端口：7000 (TCP)

规则2：
外网端口：7500 → 内网IP：[容器IP] → 内网端口：7500 (TCP)</code></pre>
<p><img src="http://yy.skydata.fun:18080/content/uploadfile/202512/26371766782163.jpeg" alt="爱快Docker部署frps" title="爱快Docker部署frps" /></p>]]></description>
    <pubDate>Sat, 27 Dec 2025 04:49:15 +0800</pubDate>
    <dc:creator>Liu_Yao</dc:creator>
    <guid>http://yy.skydata.fun:18080/?post=7</guid>
</item>
<item>
    <title>自建网站监控</title>
    <link>http://yy.skydata.fun:18080/?post=5</link>
    <description><![CDATA[<div style="border: 1px solid #444; border-radius: 10px; overflow: hidden; background: rgba(30, 30, 30, 0.5); backdrop-filter: blur(10px);">
    <div style="background: linear-gradient(90deg, rgba(40, 40, 40, 0.9) 0%, rgba(50, 50, 50, 0.9) 100%); padding: 15px; border-bottom: 1px solid #444; display: flex; justify-content: space-between; align-items: center;">
        <strong style="color: #fff; display: flex; align-items: center; gap: 12px; font-size: 16px;">
            <span style="color: #8ab4f8; font-size: 20px; animation: pulse 2s infinite;">📊</span>
            服务状态监控
        </strong>
        <a href="http://yy.skydata.fun:3004/status/sky" target="_blank" 
           style="font-size: 13px; color: #8ab4f8; text-decoration: none; display: flex; align-items: center; gap: 6px; padding: 6px 12px; border-radius: 4px; background: rgba(138, 180, 248, 0.1);">
            <span>打开面板</span>
            <span style="font-size: 16px;">↗</span>
        </a>
    </div>

    <div style="padding: 40px; text-align: center; min-height: 300px;">
        <!-- 带动态效果的电脑图标 -->
        <div style="margin: 0 auto 30px; width: 80px; height: 80px; display: flex; align-items: center; justify-content: center; 
                    background: linear-gradient(135deg, rgba(138, 180, 248, 0.1) 0%, rgba(138, 180, 248, 0.05) 100%); 
                    border-radius: 20px; border: 1px solid rgba(138, 180, 248, 0.2);">
            <span style="font-size: 48px; color: #8ab4f8; filter: drop-shadow(0 0 8px rgba(138, 180, 248, 0.4));">🖥️</span>
        </div>

        <h3 style="color: #fff; margin-bottom: 15px; font-weight: 600; font-size: 22px; letter-spacing: 0.5px;">
            实时服务监控
        </h3>

        <p style="color: #aaa; max-width: 500px; margin: 0 auto 35px; line-height: 1.7; font-size: 15px;">
            点击下方按钮，在新窗口中查看所有服务的实时运行状态、响应时间和可用性统计。
        </p>

        <!-- 主按钮 -->
        <a href="http://yy.skydata.fun:3004/status/sky" target="_blank" 
           style="display: inline-flex; align-items: center; gap: 12px; padding: 16px 40px; 
                  background: linear-gradient(135deg, #8ab4f8 0%, #6c8bff 100%); 
                  color: white; border-radius: 10px; text-decoration: none; font-weight: 600; font-size: 16px;
                  border: none; transition: all 0.3s ease; box-shadow: 0 5px 20px rgba(138, 180, 248, 0.3);">
            <span style="font-size: 22px;">🚀</span>
            <span>立即查看监控面板</span>
        </a>

        <!-- 状态指示器 -->
        <div style="margin-top: 40px; padding: 20px; background: rgba(255, 255, 255, 0.03); border-radius: 8px;">
            <div style="display: inline-flex; align-items: center; gap: 8px; padding: 8px 16px; background: rgba(76, 175, 80, 0.1); border-radius: 20px; border: 1px solid rgba(76, 175, 80, 0.3);">
                <span style="width: 8px; height: 8px; background: #4CAF50; border-radius: 50%; animation: pulse 2s infinite;"></span>
                <span style="color: #4CAF50; font-size: 14px;">监控服务运行正常</span>
            </div>
        </div>
    </div>
<p></div></p>
<style>
    @keyframes pulse {
        0% { opacity: 1; }
        50% { opacity: 0.5; }
        100% { opacity: 1; }
    }

    div[style*="backdrop-filter: blur"] a[href="http://yy.skydata.fun:3004/status/sky"]:hover {
        transform: translateY(-3px);
        box-shadow: 0 8px 25px rgba(138, 180, 248, 0.4);
        background: linear-gradient(135deg, #6c8bff 0%, #8ab4f8 100%);
    }
</style>]]></description>
    <pubDate>Tue, 23 Dec 2025 20:30:06 +0800</pubDate>
    <dc:creator>Liu_Yao</dc:creator>
    <guid>http://yy.skydata.fun:18080/?post=5</guid>
</item>
<item>
    <title>本站源码</title>
    <link>http://yy.skydata.fun:18080/?post=4</link>
    <description><![CDATA[<pre><code class="language-html">&lt;html lang="zh-CN"&gt;
&lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
    &lt;title&gt;Sky Data | 天空数据&lt;/title&gt;
    &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"&gt;
    &lt;style&gt;
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        body {
            font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
            color: #ffffff;
            min-height: 100vh;
            overflow-x: hidden;
            position: relative;
            background: transparent;
        }

        /* 透明玻璃质感背景 */
        .glass-layer {
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            z-index: -1;
            background: 
                radial-gradient(circle at 20% 30%, rgba(0, 150, 255, 0.08) 0%, transparent 40%),
                radial-gradient(circle at 80% 70%, rgba(138, 43, 226, 0.05) 0%, transparent 40%);
            backdrop-filter: blur(8px);
        }

        /* 数据粒子效果 */
        .data-particles {
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            z-index: -1;
            pointer-events: none;
        }

        .particle {
            position: absolute;
            width: 2px;
            height: 2px;
            background: rgba(0, 150, 255, 0.3);
            border-radius: 50%;
            animation: particleFloat 15s infinite linear;
        }

        /* 主容器 */
        .main-container {
            min-height: 100vh;
            display: flex;
            flex-direction: column;
            justify-content: center;
            align-items: center;
            padding: 20px;
            position: relative;
        }

        /* 标题区域 */
        .title-container {
            text-align: center;
            margin-bottom: 60px;
        }

        .main-title {
            font-size: 5.5rem;
            font-weight: 900;
            margin-bottom: 15px;
            background: linear-gradient(135deg, #0096ff 0%, #00d4ff 50%, #8a2be2 100%);
            -webkit-background-clip: text;
            -webkit-text-fill-color: transparent;
            letter-spacing: -2px;
            animation: titleGlow 3s ease-in-out infinite alternate;
        }

        @keyframes titleGlow {
            0% { filter: drop-shadow(0 0 20px rgba(0, 150, 255, 0.3)); }
            100% { filter: drop-shadow(0 0 40px rgba(0, 150, 255, 0.5)); }
        }

        .subtitle {
            font-size: 1.8rem;
            color: rgba(255, 255, 255, 0.8);
            letter-spacing: 10px;
            text-transform: uppercase;
            margin-bottom: 40px;
        }

        /* 第一行：资源总量 + 部署教程 */
        .first-row {
            display: grid;
            grid-template-columns: repeat(2, 1fr);
            gap: 30px;
            max-width: 1000px;
            width: 100%;
            margin-bottom: 30px;
        }

        /* 第二行：数据文件 + 联系方式 */
        .second-row {
            display: grid;
            grid-template-columns: repeat(2, 1fr);
            gap: 30px;
            max-width: 1000px;
            width: 100%;
        }

        /* 通用卡片样式 */
        .data-card {
            background: rgba(255, 255, 255, 0.07);
            backdrop-filter: blur(20px);
            border: 1px solid rgba(255, 255, 255, 0.12);
            border-radius: 20px;
            padding: 40px 30px;
            text-align: center;
            transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
            height: 260px;
            display: flex;
            flex-direction: column;
            justify-content: center;
            align-items: center;
        }

        .data-card:hover {
            transform: translateY(-10px);
            background: rgba(255, 255, 255, 0.12);
            border-color: #0096ff;
            box-shadow: 
                0 20px 40px rgba(0, 0, 0, 0.3),
                0 0 40px rgba(0, 150, 255, 0.2);
        }

        .data-icon {
            font-size: 2.5rem;
            margin-bottom: 20px;
            color: #0096ff;
            filter: drop-shadow(0 0 10px rgba(0, 150, 255, 0.5));
        }

        .data-number {
            font-size: 3rem;
            font-weight: 800;
            margin-bottom: 10px;
            background: linear-gradient(135deg, #0096ff, #00d4ff);
            -webkit-background-clip: text;
            -webkit-text-fill-color: transparent;
        }

        .data-label {
            font-size: 1.1rem;
            color: rgba(255, 255, 255, 0.9);
            margin-bottom: 5px;
            font-weight: 600;
        }

        .data-subtitle {
            font-size: 0.9rem;
            color: rgba(255, 255, 255, 0.6);
            text-transform: uppercase;
            letter-spacing: 1.5px;
        }

        /* 联系卡片 - 与数据文件卡片尺寸一致 */
        .contact-card {
            background: rgba(255, 255, 255, 0.07);
            backdrop-filter: blur(20px);
            border: 1px solid rgba(255, 255, 255, 0.12);
            border-radius: 20px;
            padding: 40px 30px;
            transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
            height: 260px;
            display: flex;
            flex-direction: column;
            justify-content: center;
        }

        .contact-card:hover {
            transform: translateY(-10px);
            background: rgba(255, 255, 255, 0.12);
            border-color: #0096ff;
            box-shadow: 
                0 20px 40px rgba(0, 0, 0, 0.3),
                0 0 40px rgba(0, 150, 255, 0.2);
        }

        .contact-title {
            text-align: center;
            font-size: 1.4rem;
            color: rgba(255, 255, 255, 0.9);
            margin-bottom: 35px;
            font-weight: 600;
        }

        /* 联系方式图标全部放在一行 */
        .contact-row {
            display: flex;
            justify-content: space-between;
            align-items: center;
            width: 100%;
            gap: 15px;
        }

        .contact-item {
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
            text-decoration: none;
            transition: all 0.3s ease;
            position: relative;
            flex: 1;
            padding: 10px 5px;
            cursor: pointer;
        }

        .contact-item:hover {
            transform: translateY(-5px);
        }

        .contact-icon {
            width: 60px;
            height: 60px;
            display: flex;
            align-items: center;
            justify-content: center;
            background: rgba(255, 255, 255, 0.1);
            border-radius: 18px;
            margin-bottom: 12px;
            font-size: 1.8rem;
            border: 1px solid rgba(255, 255, 255, 0.1);
            transition: all 0.3s ease;
        }

        .contact-item:hover .contact-icon {
            background: rgba(255, 255, 255, 0.15);
            border-color: rgba(255, 255, 255, 0.2);
            transform: scale(1.15) rotate(5deg);
        }

        .contact-label {
            font-size: 0.9rem;
            color: rgba(255, 255, 255, 0.8);
            font-weight: 500;
            text-align: center;
        }

        /* 图标颜色定制 - 更新顺序 */
        .gongzhong { color: #07C160; }
        .gongzhong .contact-icon { 
            background: rgba(7, 193, 96, 0.1);
            border-color: rgba(7, 193, 96, 0.2);
        }
        .gongzhong:hover .contact-icon { 
            box-shadow: 0 10px 25px rgba(7, 193, 96, 0.2);
        }

        .douyin { color: #FF6B35; }
        .douyin .contact-icon { 
            background: rgba(255, 107, 53, 0.1);
            border-color: rgba(255, 107, 53, 0.2);
        }
        .douyin:hover .contact-icon { 
            box-shadow: 0 10px 25px rgba(255, 107, 53, 0.2);
        }

        .xianyu { color: #FF2D55; }
        .xianyu .contact-icon { 
            background: rgba(255, 45, 85, 0.1);
            border-color: rgba(255, 45, 85, 0.2);
        }
        .xianyu:hover .contact-icon { 
            box-shadow: 0 10px 25px rgba(255, 45, 85, 0.2);
        }

        .fans-group { color: #0096FF; }
        .fans-group .contact-icon { 
            background: rgba(0, 150, 255, 0.1);
            border-color: rgba(0, 150, 255, 0.2);
        }
        .fans-group:hover .contact-icon { 
            box-shadow: 0 10px 25px rgba(0, 150, 255, 0.2);
        }

        /* 底部版权 */
        .copyright {
            margin-top: 50px;
            text-align: center;
            color: rgba(255, 255, 255, 0.5);
            font-size: 0.9rem;
            padding: 0 20px;
        }

        /* 二维码弹窗样式 */
        .qrcode-modal {
            display: none;
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            background: rgba(0, 0, 0, 0.8);
            backdrop-filter: blur(10px);
            z-index: 1000;
            align-items: center;
            justify-content: center;
            opacity: 0;
            transition: opacity 0.3s ease;
        }

        .qrcode-modal.active {
            display: flex;
            opacity: 1;
        }

        .qrcode-container {
            background: rgba(255, 255, 255, 0.12);
            backdrop-filter: blur(30px);
            border: 1px solid rgba(255, 255, 255, 0.2);
            border-radius: 25px;
            padding: 40px;
            max-width: 400px;
            width: 90%;
            text-align: center;
            transform: translateY(-30px);
            transition: transform 0.4s ease;
        }

        .qrcode-modal.active .qrcode-container {
            transform: translateY(0);
        }

        /* 不同平台的弹窗颜色 - 更新顺序 */
        .gongzhong-modal .qrcode-container {
            box-shadow: 
                0 30px 60px rgba(0, 0, 0, 0.5),
                0 0 50px rgba(7, 193, 96, 0.2);
        }

        .douyin-modal .qrcode-container {
            box-shadow: 
                0 30px 60px rgba(0, 0, 0, 0.5),
                0 0 50px rgba(255, 107, 53, 0.2);
        }

        .xianyu-modal .qrcode-container {
            box-shadow: 
                0 30px 60px rgba(0, 0, 0, 0.5),
                0 0 50px rgba(255, 45, 85, 0.2);
        }

        .fans-modal .qrcode-container {
            box-shadow: 
                0 30px 60px rgba(0, 0, 0, 0.5),
                0 0 50px rgba(0, 150, 255, 0.2);
        }

        .qrcode-title {
            font-size: 1.8rem;
            margin-bottom: 25px;
            font-weight: 600;
        }

        /* 不同平台的标题颜色 - 更新顺序 */
        .gongzhong-title { color: #07C160; }
        .douyin-title { color: #FF6B35; }
        .xianyu-title { color: #FF2D55; }
        .fans-title { color: #0096FF; }

        .qrcode-image {
            width: 250px;
            height: 250px;
            margin: 0 auto 25px;
            border-radius: 15px;
            padding: 15px;
            display: flex;
            align-items: center;
            justify-content: center;
            position: relative;
            overflow: hidden;
        }

        /* 不同平台的二维码背景颜色 - 更新顺序 */
        .gongzhong-modal .qrcode-image {
            background: linear-gradient(135deg, #07C160, #05a050);
        }

        .douyin-modal .qrcode-image {
            background: linear-gradient(135deg, #FF6B35, #E05A2B);
        }

        .xianyu-modal .qrcode-image {
            background: linear-gradient(135deg, #FF2D55, #E0264D);
        }

        .fans-modal .qrcode-image {
            background: linear-gradient(135deg, #0096FF, #007ACC);
        }

        .qrcode-image::before {
            content: '';
            position: absolute;
            top: -50%;
            left: -50%;
            width: 200%;
            height: 200%;
            background: linear-gradient(
                45deg,
                transparent 30%,
                rgba(255, 255, 255, 0.1) 50%,
                transparent 70%
            );
            animation: qrShine 3s infinite linear;
        }

        @keyframes qrShine {
            0% { transform: rotate(0deg); }
            100% { transform: rotate(360deg); }
        }

        .qrcode-img {
            width: 100%;
            height: 100%;
            border-radius: 10px;
            object-fit: cover;
            position: relative;
            z-index: 1;
            box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
        }

        .qrcode-tips {
            color: rgba(255, 255, 255, 0.7);
            font-size: 0.95rem;
            margin-bottom: 20px;
            line-height: 1.5;
        }

        .qrcode-close {
            background: rgba(255, 255, 255, 0.1);
            border: 1px solid rgba(255, 255, 255, 0.2);
            color: white;
            padding: 12px 30px;
            border-radius: 12px;
            font-size: 1rem;
            cursor: pointer;
            transition: all 0.3s ease;
            font-weight: 500;
        }

        .qrcode-close:hover {
            background: rgba(255, 255, 255, 0.2);
            transform: translateY(-2px);
        }

        /* 加载指示器 */
        .qrcode-loading {
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            display: flex;
            align-items: center;
            justify-content: center;
            background: rgba(255, 255, 255, 0.9);
            border-radius: 10px;
            z-index: 2;
        }

        .loading-spinner {
            width: 40px;
            height: 40px;
            border: 3px solid rgba(0, 0, 0, 0.2);
            border-radius: 50%;
            animation: spin 1s linear infinite;
        }

        /* 不同平台的加载器颜色 - 更新顺序 */
        .gongzhong-modal .loading-spinner {
            border-top: 3px solid #07C160;
        }

        .douyin-modal .loading-spinner {
            border-top: 3px solid #FF6B35;
        }

        .xianyu-modal .loading-spinner {
            border-top: 3px solid #FF2D55;
        }

        .fans-modal .loading-spinner {
            border-top: 3px solid #0096FF;
        }

        @keyframes spin {
            0% { transform: rotate(0deg); }
            100% { transform: rotate(360deg); }
        }

        /* 响应式设计 */
        @media (max-width: 1024px) {
            .main-title {
                font-size: 4rem;
            }

            .subtitle {
                font-size: 1.5rem;
                letter-spacing: 8px;
            }

            .first-row, .second-row {
                max-width: 800px;
            }

            .contact-icon {
                width: 55px;
                height: 55px;
                font-size: 1.6rem;
            }

            .qrcode-image {
                width: 220px;
                height: 220px;
            }
        }

        @media (max-width: 768px) {
            .main-title {
                font-size: 3rem;
            }

            .subtitle {
                font-size: 1.2rem;
                letter-spacing: 6px;
            }

            .first-row, .second-row {
                grid-template-columns: 1fr;
                max-width: 500px;
                gap: 20px;
            }

            .data-card, .contact-card {
                height: 240px;
                padding: 30px 20px;
            }

            .data-number {
                font-size: 2.5rem;
            }

            .contact-title {
                margin-bottom: 30px;
            }

            .contact-row {
                gap: 10px;
            }

            .contact-icon {
                width: 50px;
                height: 50px;
                font-size: 1.5rem;
            }

            .contact-label {
                font-size: 0.85rem;
            }

            .qrcode-container {
                padding: 30px;
                width: 95%;
            }

            .qrcode-image {
                width: 200px;
                height: 200px;
            }
        }

        @media (max-width: 480px) {
            .main-title {
                font-size: 2.5rem;
            }

            .subtitle {
                font-size: 1rem;
                letter-spacing: 4px;
            }

            .data-card, .contact-card {
                height: 220px;
                padding: 25px 15px;
            }

            .contact-title {
                font-size: 1.2rem;
                margin-bottom: 25px;
            }

            .contact-row {
                gap: 8px;
            }

            .contact-icon {
                width: 45px;
                height: 45px;
                font-size: 1.3rem;
                border-radius: 15px;
            }

            .contact-label {
                font-size: 0.8rem;
            }

            .data-number {
                font-size: 2.2rem;
            }

            .qrcode-container {
                padding: 25px 20px;
            }

            .qrcode-title {
                font-size: 1.5rem;
                margin-bottom: 20px;
            }

            .qrcode-image {
                width: 180px;
                height: 180px;
                padding: 10px;
            }
        }

        /* 淡入动画 */
        .fade-in {
            opacity: 0;
            transform: translateY(30px);
            transition: all 0.8s ease;
        }

        .fade-in.visible {
            opacity: 1;
            transform: translateY(0);
        }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;!-- 玻璃质感背景层 --&gt;
    &lt;div class="glass-layer"&gt;&lt;/div&gt;

    &lt;!-- 数据粒子 --&gt;
    &lt;div class="data-particles" id="dataParticles"&gt;&lt;/div&gt;

    &lt;!-- 二维码弹窗 - 公众号 --&gt;
    &lt;div class="qrcode-modal gongzhong-modal" id="gongzhongModal"&gt;
        &lt;div class="qrcode-container"&gt;
            &lt;h3 class="qrcode-title gongzhong-title"&gt;公众号二维码&lt;/h3&gt;
            &lt;p class="qrcode-tips"&gt;使用微信扫一扫功能扫描下方二维码&lt;br&gt;关注我的公众号获取更多内容&lt;/p&gt;
            &lt;div class="qrcode-image"&gt;
                &lt;div class="qrcode-loading" id="gongzhongLoading"&gt;
                    &lt;div class="loading-spinner"&gt;&lt;/div&gt;
                &lt;/div&gt;
                &lt;!-- 公众号二维码图片 --&gt;
                &lt;img src="https://yy.skydata.fun:8443/content/uploadfile/202512/81781766490707.jpg" 
                     alt="Sky Data 公众号二维码" 
                     class="qrcode-img"
                     id="gongzhongImg"&gt;
            &lt;/div&gt;
            &lt;button class="qrcode-close" onclick="closeModal('gongzhong')"&gt;关闭&lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;!-- 二维码弹窗 - 抖音 --&gt;
    &lt;div class="qrcode-modal douyin-modal" id="douyinModal"&gt;
        &lt;div class="qrcode-container"&gt;
            &lt;h3 class="qrcode-title douyin-title"&gt;抖音二维码&lt;/h3&gt;
            &lt;p class="qrcode-tips"&gt;使用抖音App扫描下方二维码&lt;br&gt;关注我的抖音账号获取更多内容&lt;/p&gt;
            &lt;div class="qrcode-image"&gt;
                &lt;div class="qrcode-loading" id="douyinLoading"&gt;
                    &lt;div class="loading-spinner"&gt;&lt;/div&gt;
                &lt;/div&gt;
                &lt;!-- 抖音二维码图片 --&gt;
                &lt;img src="https://yy.skydata.fun:8443/content/uploadfile/202512/014a1766490707.png" 
                     alt="Sky Data 抖音二维码" 
                     class="qrcode-img"
                     id="douyinImg"&gt;
            &lt;/div&gt;
            &lt;button class="qrcode-close" onclick="closeModal('douyin')"&gt;关闭&lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;!-- 二维码弹窗 - 闲鱼 --&gt;
    &lt;div class="qrcode-modal xianyu-modal" id="xianyuModal"&gt;
        &lt;div class="qrcode-container"&gt;
            &lt;h3 class="qrcode-title xianyu-title"&gt;闲鱼二维码&lt;/h3&gt;
            &lt;p class="qrcode-tips"&gt;使用闲鱼App扫描下方二维码&lt;br&gt;查看我的闲鱼店铺和商品&lt;/p&gt;
            &lt;div class="qrcode-image"&gt;
                &lt;div class="qrcode-loading" id="xianyuLoading"&gt;
                    &lt;div class="loading-spinner"&gt;&lt;/div&gt;
                &lt;/div&gt;
                &lt;!-- 闲鱼二维码图片 --&gt;
                &lt;img src="https://yy.skydata.fun:8443/content/uploadfile/202512/af5c1766490707.jpg" 
                     alt="Sky Data 闲鱼二维码" 
                     class="qrcode-img"
                     id="xianyuImg"&gt;
            &lt;/div&gt;
            &lt;button class="qrcode-close" onclick="closeModal('xianyu')"&gt;关闭&lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;!-- 二维码弹窗 - 粉丝群 --&gt;
    &lt;div class="qrcode-modal fans-modal" id="fansModal"&gt;
        &lt;div class="qrcode-container"&gt;
            &lt;h3 class="qrcode-title fans-title"&gt;粉丝群二维码&lt;/h3&gt;
            &lt;p class="qrcode-tips"&gt;扫描下方二维码加入粉丝群&lt;br&gt;与更多爱好者交流分享&lt;/p&gt;
            &lt;div class="qrcode-image"&gt;
                &lt;div class="qrcode-loading" id="fansLoading"&gt;
                    &lt;div class="loading-spinner"&gt;&lt;/div&gt;
                &lt;/div&gt;
                &lt;!-- 粉丝群二维码图片 --&gt;
                &lt;img src="https://yy.skydata.fun:8443/content/uploadfile/202512/5f721766490707.jpg" 
                     alt="Sky Data 粉丝群二维码" 
                     class="qrcode-img"
                     id="fansImg"&gt;
            &lt;/div&gt;
            &lt;button class="qrcode-close" onclick="closeModal('fans')"&gt;关闭&lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;!-- 主要内容 --&gt;
    &lt;main class="main-container"&gt;
        &lt;!-- 标题区域 --&gt;
        &lt;div class="title-container fade-in"&gt;
            &lt;h1 class="main-title"&gt;SKY DATA&lt;/h1&gt;
            &lt;div class="subtitle"&gt;天空数据&lt;/div&gt;
        &lt;/div&gt;

        &lt;!-- 第一行：资源总量 + 部署教程 --&gt;
        &lt;div class="first-row"&gt;
            &lt;div class="data-card fade-in"&gt;
                &lt;div class="data-icon"&gt;📊&lt;/div&gt;
                &lt;div class="data-number"&gt;2K&lt;/div&gt;
                &lt;div class="data-label"&gt;资源总量&lt;/div&gt;
                &lt;div class="data-subtitle"&gt;Total Resources Files&lt;/div&gt;
            &lt;/div&gt;

            &lt;div class="data-card fade-in"&gt;
                &lt;div class="data-icon"&gt;💾&lt;/div&gt;
                &lt;div class="data-number"&gt;20G&lt;/div&gt;
                &lt;div class="data-label"&gt;数据文件&lt;/div&gt;
                &lt;div class="data-subtitle"&gt;Data Files&lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;

        &lt;!-- 第二行：部署教程 + 联系方式 --&gt;
        &lt;div class="second-row"&gt;
            &lt;div class="data-card fade-in"&gt;
                &lt;div class="data-icon"&gt;🚀&lt;/div&gt;
                &lt;div class="data-number"&gt;1&lt;/div&gt;
                &lt;div class="data-label"&gt;部署教程&lt;/div&gt;
                &lt;div class="data-subtitle"&gt;Open Source&lt;/div&gt;
            &lt;/div&gt;

            &lt;div class="contact-card fade-in"&gt;
                &lt;div class="contact-title"&gt;联系我们&lt;/div&gt;
                &lt;div class="contact-row"&gt;
                    &lt;!-- 公众号图标 - 点击弹出二维码 --&gt;
                    &lt;div class="contact-item gongzhong" onclick="openModal('gongzhong')"&gt;
                        &lt;div class="contact-icon"&gt;
                            &lt;i class="fab fa-weixin"&gt;&lt;/i&gt;
                        &lt;/div&gt;
                        &lt;span class="contact-label"&gt;公众号&lt;/span&gt;
                    &lt;/div&gt;

                    &lt;!-- 抖音图标 - 点击弹出二维码 --&gt;
                    &lt;div class="contact-item douyin" onclick="openModal('douyin')"&gt;
                        &lt;div class="contact-icon"&gt;
                            &lt;i class="fab fa-tiktok"&gt;&lt;/i&gt;
                        &lt;/div&gt;
                        &lt;span class="contact-label"&gt;抖音&lt;/span&gt;
                    &lt;/div&gt;

                    &lt;!-- 闲鱼图标 - 点击弹出二维码 --&gt;
                    &lt;div class="contact-item xianyu" onclick="openModal('xianyu')"&gt;
                        &lt;div class="contact-icon"&gt;
                            &lt;i class="fas fa-fish"&gt;&lt;/i&gt;
                        &lt;/div&gt;
                        &lt;span class="contact-label"&gt;闲鱼&lt;/span&gt;
                    &lt;/div&gt;

                    &lt;!-- 粉丝群图标 - 点击弹出二维码 --&gt;
                    &lt;div class="contact-item fans-group" onclick="openModal('fans')"&gt;
                        &lt;div class="contact-icon"&gt;
                            &lt;i class="fas fa-users"&gt;&lt;/i&gt;
                        &lt;/div&gt;
                        &lt;span class="contact-label"&gt;粉丝群&lt;/span&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;

        &lt;!-- 版权信息 --&gt;
        &lt;div class="copyright fade-in"&gt;
            © 2025 Sky Data · 云端数据资源库
        &lt;/div&gt;
    &lt;/main&gt;

    &lt;script&gt;
        // 创建数据粒子
        const particlesContainer = document.getElementById('dataParticles');
        for (let i = 0; i &lt; 120; i++) {
            const particle = document.createElement('div');
            particle.classList.add('particle');

            // 随机位置
            particle.style.left = Math.random() * 100 + '%';
            particle.style.top = Math.random() * 100 + '%';

            // 随机大小和透明度
            const size = Math.random() * 3 + 1;
            particle.style.width = particle.style.height = size + 'px';
            particle.style.opacity = Math.random() * 0.5 + 0.1;

            // 随机颜色（蓝色到紫色）
            const hue = 200 + Math.random() * 120;
            particle.style.background = `hsla(${hue}, 100%, 70%, ${particle.style.opacity})`;

            // 随机动画
            particle.style.animationDelay = Math.random() * 5 + 's';
            particle.style.animationDuration = Math.random() * 10 + 10 + 's';

            particlesContainer.appendChild(particle);
        }

        // 二维码图片链接配置 - 已更新顺序
        const qrcodeLinks = {
            'gongzhong': 'https://yy.skydata.fun:8443/content/uploadfile/202512/81781766490707.jpg',
            'douyin': 'https://yy.skydata.fun:8443/content/uploadfile/202512/014a1766490707.png',
            'xianyu': 'https://yy.skydata.fun:8443/content/uploadfile/202512/af5c1766490707.jpg',
            'fans': 'https://yy.skydata.fun:8443/content/uploadfile/202512/5f721766490707.jpg'
        };

        // 二维码弹窗管理 - 更新了名称
        const modals = {
            'gongzhong': document.getElementById('gongzhongModal'),
            'douyin': document.getElementById('douyinModal'),
            'xianyu': document.getElementById('xianyuModal'),
            'fans': document.getElementById('fansModal')
        };

        const images = {
            'gongzhong': document.getElementById('gongzhongImg'),
            'douyin': document.getElementById('douyinImg'),
            'xianyu': document.getElementById('xianyuImg'),
            'fans': document.getElementById('fansImg')
        };

        const loadings = {
            'gongzhong': document.getElementById('gongzhongLoading'),
            'douyin': document.getElementById('douyinLoading'),
            'xianyu': document.getElementById('xianyuLoading'),
            'fans': document.getElementById('fansLoading')
        };

        // 打开弹窗函数
        function openModal(type) {
            // 先关闭所有其他弹窗
            Object.keys(modals).forEach(key =&gt; {
                modals[key].classList.remove('active');
            });

            // 打开指定弹窗
            modals[type].classList.add('active');
            document.body.style.overflow = 'hidden';

            // 重置加载状态
            loadings[type].style.display = 'flex';
            loadings[type].innerHTML = '&lt;div class="loading-spinner"&gt;&lt;/div&gt;';

            // 强制刷新图片（防止缓存问题）
            const timestamp = new Date().getTime();
            images[type].src = `${qrcodeLinks[type]}?t=${timestamp}`;
        }

        // 关闭弹窗函数
        function closeModal(type) {
            modals[type].classList.remove('active');
            document.body.style.overflow = 'auto';
        }

        // 预加载所有二维码图片
        function preloadAllQrcodes() {
            Object.keys(qrcodeLinks).forEach(type =&gt; {
                const img = new Image();
                img.src = qrcodeLinks[type];
                img.onload = function() {
                    console.log(`${type} 二维码图片预加载成功`);
                };
                img.onerror = function() {
                    console.error(`${type} 二维码图片加载失败`);
                    loadings[type].innerHTML = '二维码加载失败&lt;br&gt;&lt;small&gt;请稍后重试&lt;/small&gt;';
                };
            });
        }

        // 页面加载后预加载所有二维码
        window.addEventListener('load', preloadAllQrcodes);

        // 图片加载完成时的处理
        Object.keys(images).forEach(type =&gt; {
            images[type].onload = function() {
                loadings[type].style.display = 'none';
                console.log(`${type} 二维码图片加载完成`);
            };

            images[type].onerror = function() {
                loadings[type].innerHTML = '二维码加载失败&lt;br&gt;&lt;small&gt;请检查网络连接或稍后重试&lt;/small&gt;';
                console.error(`${type} 二维码图片加载错误`);
            };
        });

        // 点击弹窗背景关闭当前弹窗
        document.querySelectorAll('.qrcode-modal').forEach(modal =&gt; {
            modal.addEventListener('click', function(e) {
                if (e.target === modal) {
                    const modalType = modal.classList[1].replace('-modal', '');
                    closeModal(modalType);
                }
            });
        });

        // ESC键关闭弹窗
        document.addEventListener('keydown', function(e) {
            if (e.key === 'Escape') {
                Object.keys(modals).forEach(type =&gt; {
                    if (modals[type].classList.contains('active')) {
                        closeModal(type);
                    }
                });
            }
        });

        // 淡入动画
        const fadeElements = document.querySelectorAll('.fade-in');

        function checkScroll() {
            fadeElements.forEach(element =&gt; {
                const rect = element.getBoundingClientRect();
                if (rect.top &lt; window.innerHeight * 0.85) {
                    element.classList.add('visible');
                }
            });
        }

        // 初始检查
        checkScroll();
        window.addEventListener('scroll', checkScroll);
        window.addEventListener('resize', checkScroll);

        // 鼠标交互效果
        document.addEventListener('mousemove', (e) =&gt; {
            const x = e.clientX / window.innerWidth;
            const y = e.clientY / window.innerHeight;

            // 背景移动效果
            document.querySelector('.glass-layer').style.transform = 
                `translate(${x * 20}px, ${y * 20}px)`;

            // 粒子跟随效果
            particlesContainer.style.transform = 
                `translate(${x * -15}px, ${y * -15}px)`;
        });

        // 标题发光效果
        const title = document.querySelector('.main-title');
        setInterval(() =&gt; {
            const intensity = Math.sin(Date.now() / 2000) * 0.3 + 0.7;
            title.style.filter = `drop-shadow(0 0 ${25 * intensity}px rgba(0, 150, 255, 0.4))`;
        }, 100);

        // 联系方式图标动画
        const contactIcons = document.querySelectorAll('.contact-icon');
        contactIcons.forEach(icon =&gt; {
            icon.addEventListener('mouseenter', () =&gt; {
                icon.style.transform = 'scale(1.15) rotate(5deg)';
            });

            icon.addEventListener('mouseleave', () =&gt; {
                icon.style.transform = 'scale(1) rotate(0deg)';
            });
        });

        // 背景色彩变化
        const glassLayer = document.querySelector('.glass-layer');
        let hue = 200;

        setInterval(() =&gt; {
            hue = (hue + 0.1) % 360;
            glassLayer.style.background = 
                `radial-gradient(circle at 20% 30%, hsla(${hue}, 100%, 70%, 0.08) 0%, transparent 40%),
                 radial-gradient(circle at 80% 70%, hsla(${hue + 60}, 100%, 70%, 0.05) 0%, transparent 40%)`;
        }, 100);

        // 卡片点击波纹效果
        const cards = document.querySelectorAll('.data-card, .contact-card');
        cards.forEach(card =&gt; {
            card.addEventListener('click', function(e) {
                // 如果是联系方式按钮，不执行波纹效果（已经有弹窗了）
                if (e.target.closest('.contact-item')) return;

                const rect = this.getBoundingClientRect();
                const x = e.clientX - rect.left;
                const y = e.clientY - rect.top;

                const ripple = document.createElement('div');
                ripple.style.position = 'absolute';
                ripple.style.left = x + 'px';
                ripple.style.top = y + 'px';
                ripple.style.width = ripple.style.height = '0px';
                ripple.style.background = 'radial-gradient(circle, rgba(0, 150, 255, 0.2), transparent)';
                ripple.style.borderRadius = '50%';
                ripple.style.transform = 'translate(-50%, -50%)';
                ripple.style.pointerEvents = 'none';
                ripple.style.zIndex = '1';

                this.appendChild(ripple);

                requestAnimationFrame(() =&gt; {
                    ripple.style.width = ripple.style.height = '150px';
                    ripple.style.opacity = '0';
                    ripple.style.transition = 'all 0.5s ease-out';
                });

                setTimeout(() =&gt; ripple.remove(), 500);
            });
        });

        // 确保所有卡片高度一致
        function equalizeCardHeights() {
            const dataCards = document.querySelectorAll('.data-card');
            const contactCard = document.querySelector('.contact-card');

            if (dataCards.length &gt; 0 &amp;&amp; contactCard) {
                const maxHeight = Math.max(
                    ...Array.from(dataCards).map(card =&gt; card.offsetHeight)
                );

                dataCards.forEach(card =&gt; {
                    card.style.height = `${maxHeight}px`;
                });
                contactCard.style.height = `${maxHeight}px`;
            }
        }

        // 页面加载后调整高度
        window.addEventListener('load', equalizeCardHeights);
        window.addEventListener('resize', equalizeCardHeights);
    &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;

&lt;audio id="bgAudio" autoplay hidden&gt;&lt;/audio&gt;

&lt;script&gt;
  const musicList = [
    "https://yy.skydata.fun:8443/content/uploadfile/202512/d9181766466706.mp3",
    "https://yy.skydata.fun:8443/content/uploadfile/202512/8bd91766466704.mp3",
    "https://yy.skydata.fun:8443/content/uploadfile/202512/86141766466702.mp3",
    "https://yy.skydata.fun:8443/content/uploadfile/202512/49f61766466700.mp3",
    "https://yy.skydata.fun:8443/content/uploadfile/202512/10811766466698.mp3",
    "https://yy.skydata.fun:8443/content/uploadfile/202512/9dff1766466695.mp3",
    "https://yy.skydata.fun:8443/content/uploadfile/202512/093f1766466694.mp3",

  ];

  const audio = document.getElementById('bgAudio');

    // 设置默认音量为30%
  audio.volume = 0.3;

  function playRandomMusic() {
    const randomIndex = Math.floor(Math.random() * musicList.length);
    audio.src = musicList[randomIndex];
    audio.play();
  }

  // 监听歌曲结束事件
  audio.addEventListener('ended', playRandomMusic);

  // 播放第一首随机歌曲
  playRandomMusic();
&lt;/script&gt;</code></pre>]]></description>
    <pubDate>Tue, 23 Dec 2025 15:55:20 +0800</pubDate>
    <dc:creator>Liu_Yao</dc:creator>
    <guid>http://yy.skydata.fun:18080/?post=4</guid>
</item></channel>
</rss>