<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>niuniu的博客</title><description>分享生活，开发历程，学习中</description><link>https://niuhaoyu.xyz/</link><language>zh-CN</language><item><title>物联网设备控制小程序：从使用到设备接入</title><link>https://niuhaoyu.xyz/posts/iot-miniprogram-guide/</link><guid isPermaLink="true">https://niuhaoyu.xyz/posts/iot-miniprogram-guide/</guid><description>这是我的团队物联网设备控制小程序介绍和接入教程，包含登录、设备绑定、任务系统、自动任务、HTTP 设备协议和完整 Python 设备示例。</description><pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;这个小程序是给 50 到 60 人规模的小团队使用的设备控制工具。它的目标不是做复杂的大平台，而是让团队成员能稳定地登录、绑定设备、查看状态、下发命令，并把常用操作沉淀成任务或模板。&lt;/p&gt;
&lt;p&gt;&amp;lt;p&amp;gt;
&amp;lt;a href=&quot;#完整设备示例&quot; style=&quot;display:inline-flex;align-items:center;justify-content:center;padding:12px 18px;border-radius:10px;background:#007a6c;color:#fff;font-weight:700;text-decoration:none;&quot;&amp;gt;查看完整接入示例&amp;lt;/a&amp;gt;
&amp;lt;/p&amp;gt;&lt;/p&gt;
&lt;h2&gt;小程序能做什么&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;微信一键登录，首次使用访问码绑定身份，后续直接登录。&lt;/li&gt;
&lt;li&gt;管理员维护访问码、团队人数上限和允许名单。&lt;/li&gt;
&lt;li&gt;用户手动绑定设备，可选择个人可见或团队共享。&lt;/li&gt;
&lt;li&gt;查看设备在线状态、最近上报时间和状态数据。&lt;/li&gt;
&lt;li&gt;下发设备命令，例如开关、模式切换、参数设置和请求链接。&lt;/li&gt;
&lt;li&gt;创建手动任务、任务模板和自动任务。&lt;/li&gt;
&lt;li&gt;自动任务支持两种触发表达：定时触发和钩子触发。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;为什么不是只支持 ESP32&lt;/h2&gt;
&lt;p&gt;ESP32-S3 只是当前固件示例。真正的接入协议是 HTTP JSON，所以树莓派、Linux 网关、Windows 上位机、其他联网 MCU，甚至一段 Python 脚本都可以接入。&lt;/p&gt;
&lt;p&gt;设备只要能完成三件事就行：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;定期上报状态。&lt;/li&gt;
&lt;li&gt;主动拉取待执行命令。&lt;/li&gt;
&lt;li&gt;执行后回写成功或失败。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这种设计适合弱服务器，因为服务器不需要和每台设备保持长连接，小程序也不需要高频直连设备。&lt;/p&gt;
&lt;h2&gt;设备接入流程&lt;/h2&gt;
&lt;h3&gt;1. 上报状态&lt;/h3&gt;
&lt;p&gt;设备定期请求：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;POST https://api.niuhaoyu.xyz/api/device/{deviceId}/status
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;请求体示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;online&quot;: true,
  &quot;status&quot;: {
    &quot;power&quot;: &quot;on&quot;,
    &quot;temperature&quot;: 26.5,
    &quot;mode&quot;: &quot;eco&quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. 拉取命令&lt;/h3&gt;
&lt;p&gt;设备轮询：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;GET https://api.niuhaoyu.xyz/api/device/{deviceId}/commands/next
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果有命令，服务器会返回类似数据：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;id&quot;: &quot;cmd-xxx&quot;,
  &quot;command&quot;: {
    &quot;type&quot;: &quot;setPower&quot;,
    &quot;payload&quot;: {
      &quot;power&quot;: &quot;off&quot;
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. 回写结果&lt;/h3&gt;
&lt;p&gt;执行完成后请求：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;POST https://api.niuhaoyu.xyz/api/device/{deviceId}/commands/{commandId}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;成功示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;status&quot;: &quot;success&quot;,
  &quot;result&quot;: {
    &quot;power&quot;: &quot;off&quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;失败示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;status&quot;: &quot;failed&quot;,
  &quot;message&quot;: &quot;unsupported command&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;任务系统怎么理解&lt;/h2&gt;
&lt;p&gt;小程序里只需要理解两类任务：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;手动任务：用户点击后立即执行。&lt;/li&gt;
&lt;li&gt;自动任务：保存成规则，由定时或钩子触发。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;模板不是任务类型，它只是常用操作的保存方式。比如“打开电源 10 秒后关闭”可以保存成模板，需要时一键执行；“每天 08:00 打开设备”则应该保存成自动任务。&lt;/p&gt;
&lt;h2&gt;常用命令类型&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;用途&lt;/th&gt;
&lt;th&gt;Payload 示例&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;setPower&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;开关&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{&quot;power&quot;:&quot;on&quot;}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;setMode&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;模式切换&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{&quot;mode&quot;:&quot;eco&quot;}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;setValue&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;参数设置&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{&quot;key&quot;:&quot;threshold&quot;,&quot;value&quot;:50}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;httpRequest&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;让设备请求一个链接&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{&quot;method&quot;:&quot;GET&quot;,&quot;url&quot;:&quot;https://example.com/action&quot;}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;完整设备示例&lt;/h2&gt;
&lt;p&gt;下面示例可以在电脑、树莓派或普通 Linux 网关上运行。真实项目里不要把设备 token 写进公开仓库，应该从环境变量或本地安全配置读取。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import json
import os
import time
import urllib.request

API_BASE = os.getenv(&quot;IOT_API_BASE&quot;, &quot;https://api.niuhaoyu.xyz/api&quot;)
DEVICE_ID = os.getenv(&quot;IOT_DEVICE_ID&quot;, &quot;demo-python-001&quot;)
DEVICE_TOKEN = os.getenv(&quot;IOT_DEVICE_TOKEN&quot;, &quot;replace-with-device-token&quot;)


def request_json(path, method=&quot;GET&quot;, payload=None):
    data = None
    if payload is not None:
        data = json.dumps(payload).encode(&quot;utf-8&quot;)
    req = urllib.request.Request(
        API_BASE + path,
        data=data,
        method=method,
        headers={
            &quot;Content-Type&quot;: &quot;application/json&quot;,
            &quot;Authorization&quot;: &quot;Bearer &quot; + DEVICE_TOKEN,
        },
    )
    with urllib.request.urlopen(req, timeout=8) as resp:
        return json.loads(resp.read().decode(&quot;utf-8&quot;))


def report_status(state):
    return request_json(
        &quot;/device/%s/status&quot; % DEVICE_ID,
        method=&quot;POST&quot;,
        payload={
            &quot;online&quot;: True,
            &quot;status&quot;: state,
        },
    )


def next_command():
    result = request_json(&quot;/device/%s/commands/next&quot; % DEVICE_ID)
    return (result.get(&quot;data&quot;) or {}).get(&quot;command&quot;)


def finish_command(command_id, status, result=None, message=&quot;&quot;):
    payload = {&quot;status&quot;: status}
    if result is not None:
        payload[&quot;result&quot;] = result
    if message:
        payload[&quot;message&quot;] = message
    return request_json(
        &quot;/device/%s/commands/%s&quot; % (DEVICE_ID, command_id),
        method=&quot;POST&quot;,
        payload=payload,
    )


def execute(command, state):
    command_type = command.get(&quot;type&quot;)
    payload = command.get(&quot;payload&quot;) or {}

    if command_type == &quot;setPower&quot;:
        state[&quot;power&quot;] = payload.get(&quot;power&quot;, &quot;off&quot;)
        return True, state, &quot;&quot;

    if command_type == &quot;setMode&quot;:
        state[&quot;mode&quot;] = payload.get(&quot;mode&quot;, &quot;normal&quot;)
        return True, state, &quot;&quot;

    if command_type == &quot;setValue&quot;:
        key = payload.get(&quot;key&quot;, &quot;value&quot;)
        state[key] = payload.get(&quot;value&quot;)
        return True, state, &quot;&quot;

    return False, state, &quot;unsupported command: %s&quot; % command_type


def main():
    state = {
        &quot;power&quot;: &quot;off&quot;,
        &quot;mode&quot;: &quot;normal&quot;,
        &quot;temperature&quot;: 26.5,
    }
    while True:
        report_status(state)
        item = next_command()
        if item:
            command_id = item.get(&quot;id&quot;)
            command = item.get(&quot;command&quot;) or {}
            ok, state, message = execute(command, state)
            if ok:
                finish_command(command_id, &quot;success&quot;, result=state)
            else:
                finish_command(command_id, &quot;failed&quot;, message=message)
        time.sleep(3)


if __name__ == &quot;__main__&quot;:
    main()
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;小程序使用建议&lt;/h2&gt;
&lt;p&gt;首次使用时先完成微信登录和访问码绑定。添加设备时，如果只是自己调试，选择“个人可见”；如果团队都要用，选择“团队共享”。设备上线后，先在设备详情页确认状态能刷新，再创建任务。&lt;/p&gt;
&lt;p&gt;手动任务适合立即控制。自动任务适合规则化场景，例如每天固定时间执行，或者后续由设备告警、传感器阈值、外部 HTTP 事件触发。&lt;/p&gt;
</content:encoded><category>物联网</category><category>物联网</category><category>微信小程序</category><category>设备接入</category></item><item><title>母亲节，我做了一个交互网页</title><link>https://niuhaoyu.xyz/posts/mothers-day-interactive-page/</link><guid isPermaLink="true">https://niuhaoyu.xyz/posts/mothers-day-interactive-page/</guid><description>今年母亲节，我用代码给妈妈做了一份特别的礼物——一个充满惊喜的交互网页。从寂静星空到五彩纸屑，从萤火虫光流到深情告白，每一个像素都在说&quot;我爱你&quot;。</description><pubDate>Sun, 10 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;今年母亲节，我想送妈妈一份不一样的礼物。&lt;/p&gt;
&lt;p&gt;不是鲜花，不是蛋糕，而是一个&lt;strong&gt;打开就能感受到心意的交互网页&lt;/strong&gt;。从构思到实现，我用了一个下午。但我觉得，这是今年母亲节我做的最值的一件事。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;从一盏灯开始&lt;/h2&gt;
&lt;p&gt;故事的起点是一句很简单的想法：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&quot;为她点一盏灯&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;页面的前几秒是安静的——深紫色的夜空中，八十颗星星缓缓眨着眼。触碰屏幕，金色的萤火虫从指尖流淌而出，汇聚成一条光河，引向一盏若隐若现的灯笼。&lt;/p&gt;
&lt;p&gt;那盏灯笼上写着：&lt;strong&gt;「为妈妈点一盏灯」&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;当指尖触碰灯笼&lt;/h2&gt;
&lt;p&gt;点击的瞬间——&lt;/p&gt;
&lt;p&gt;整个画面被暖金色的光芒吞没，五彩纸屑从四面八方炸裂开来，带着⭐星星和✨光点。四层极光在背景中缓缓漂移，钢琴旋律从耳机里流淌而出。&lt;/p&gt;
&lt;p&gt;然后，祝福的文字从模糊中渐渐清晰：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;妈妈&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;谢谢你用一生的温柔，照亮了我所有的路&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🌸 永远爱您 🌸&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;—— 你的孩子&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;花瓣、爱心、蝴蝶漫天飘落。整个过程大约 10 秒，但那种被爱包围的感觉，会一直留在心里。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这一切，只用了一个 HTML 文件。打开即用，无需安装，无需网络。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;背后的设计细节&lt;/h2&gt;
&lt;h3&gt;🎨 视觉&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;深暖紫&lt;/strong&gt;基调，配金色萤火虫粒子，营造静谧温柔的氛围&lt;/li&gt;
&lt;li&gt;80 颗&lt;strong&gt;闪烁星星&lt;/strong&gt;散布背景，像童年的夏夜&lt;/li&gt;
&lt;li&gt;四层&lt;strong&gt;极光漂移&lt;/strong&gt;，鼠标移动时产生视差深度感&lt;/li&gt;
&lt;li&gt;惊喜后淡入 &lt;strong&gt;复古花卉背景&lt;/strong&gt;，母亲节快乐已在图中&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;🎵 听觉&lt;/h3&gt;
&lt;p&gt;用 &lt;strong&gt;Web Audio API&lt;/strong&gt; 完全用代码合成了一首简短的钢琴摇篮曲：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;C 大调五声音阶旋律，温暖柔和&lt;/li&gt;
&lt;li&gt;暖音垫和弦铺垫，像妈妈的怀抱&lt;/li&gt;
&lt;li&gt;点击瞬间还有 &lt;strong&gt;烟花爆炸音效&lt;/strong&gt;——BOOM！CRACK！噼啪闪烁！&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;✨ 技术亮点&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;特性&lt;/th&gt;
&lt;th&gt;实现&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;粒子系统&lt;/td&gt;
&lt;td&gt;Canvas 自绘萤火虫光流，带渐变辉光和连线&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;五彩纸屑&lt;/td&gt;
&lt;td&gt;canvas-confetti 库，5 波连爆 + 星星形状 + 金雨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;背景音乐&lt;/td&gt;
&lt;td&gt;Web Audio API 合成，零外部依赖&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;烟花音效&lt;/td&gt;
&lt;td&gt;Web Audio API 合成（低频 boom + 噪声 crack + 高频 sparkle）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;响应式&lt;/td&gt;
&lt;td&gt;移动端优先，触摸事件完整支持&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;重放&lt;/td&gt;
&lt;td&gt;可反复点击重新体验&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;体验一下&lt;/h2&gt;
&lt;p&gt;点击下面的按钮，打开这个小小的交互世界。建议戴上耳机，调大音量，然后 &lt;strong&gt;触碰屏幕，找到那盏灯笼&lt;/strong&gt; ✨&lt;/p&gt;
&lt;p&gt;&amp;lt;a href=&quot;/games/Mather/index.html&quot; target=&quot;_blank&quot; style=&quot;display: inline-block; padding: 16px 36px; background: linear-gradient(135deg, #f43f5e, #ec4899); color: #fff; text-decoration: none; border-radius: 50px; font-size: 20px; font-weight: bold; letter-spacing: 4px; box-shadow: 0 4px 25px rgba(244,63,94,0.4); transition: all 0.3s ease;&quot;&amp;gt;
🏮 为妈妈点一盏灯
&amp;lt;/a&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;一点想说的话&lt;/h2&gt;
&lt;p&gt;我们总说&quot;爱要表达&quot;，但有时候千言万语不如一个精心准备的瞬间。&lt;/p&gt;
&lt;p&gt;这个网页只有几十 KB，但它承载的是我想对妈妈说的所有话：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;谢谢你。我爱你。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果你也想给妈妈做点什么，不妨从一个小小的网页开始——代码也可以很温暖。&lt;/p&gt;
&lt;p&gt;Happy Mother&apos;s Day 💝&lt;/p&gt;
</content:encoded><category>生活随笔 / 项目分享 / 交互设计</category><category>母亲节</category><category>交互设计</category><category>HTML</category><category>动画</category></item><item><title>近期单曲循环：我的音乐推荐</title><link>https://niuhaoyu.xyz/posts/my-music-recommendation/</link><guid isPermaLink="true">https://niuhaoyu.xyz/posts/my-music-recommendation/</guid><description>最近比较喜欢听的歌曲，跟大家分享一下。从欧美热单到粤语经典，横跨多种风格，每一首都值得循环播放。</description><pubDate>Sun, 03 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;近期单曲循环&lt;/h1&gt;
&lt;p&gt;最近整理了一份自己常听的歌单，风格跨度还挺大的——从 F1 电影原声到古惑仔经典，从英雄联盟虚拟乐团到 Beyond 不朽名曲。分享给你，希望也有你喜欢的！&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;🎵 歌单目录（直接播放）&lt;/h2&gt;
&lt;h3&gt;快乐崇拜 最近搞机器人一直在听，还挺好听，一会把视频发过来、&lt;/h3&gt;
&lt;p&gt;::music{meting=&quot;https://meting.spr-aachen.com/api?server=netease&amp;amp;type=song&amp;amp;id=2076688961&quot;}&lt;/p&gt;
&lt;h3&gt;1. Lose My Mind (feat. Doja Cat) [From F1® The Movie]&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Don Toliver / Doja Cat&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;::music{meting=&quot;https://meting.spr-aachen.com/api?server=netease&amp;amp;type=song&amp;amp;id=2700280437&quot;}&lt;/p&gt;
&lt;p&gt;F1 电影原声带，Don Toliver 联手 Doja Cat，节奏感炸裂，适合开车时听。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;2. My Dilemma 2.0&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Selena Gomez &amp;amp; The Scene&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;::music{meting=&quot;https://meting.spr-aachen.com/api?server=netease&amp;amp;type=song&amp;amp;id=29747527&quot;}&lt;/p&gt;
&lt;p&gt;Selena 经典老歌的 2.0 版本，&quot;One half of me wants ya, and the other half wants to forget&quot;——太有共鸣了。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;3. INDUSTRY BABY&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Lil Nas X / Jack Harlow&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;::music{meting=&quot;https://meting.spr-aachen.com/api?server=netease&amp;amp;type=song&amp;amp;id=1862710350&quot;}&lt;/p&gt;
&lt;p&gt;2021 年的神曲，到现在听还是那么带劲，Lil Nas X 的才华真的没话说。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;4. My Love&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Westlife&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;::music{meting=&quot;https://meting.spr-aachen.com/api?server=netease&amp;amp;type=song&amp;amp;id=2080607&quot;}&lt;/p&gt;
&lt;p&gt;经典中的经典，&quot;So I say a little prayer...&quot; 前奏一响，青春就回来了。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;5. GIANTS&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;True Damage / Becky G / Keke Palmer / (G)I-DLE 田小娟&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;::music{meting=&quot;https://meting.spr-aachen.com/api?server=netease&amp;amp;type=song&amp;amp;id=1402845242&quot;}&lt;/p&gt;
&lt;p&gt;英雄联盟虚拟乐团 True Damage 的出道曲，2019 年全球总决赛现场首唱，炸裂全场！&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;6. Sweet but Psycho&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Ava Max&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;::music{meting=&quot;https://meting.spr-aachen.com/api?server=netease&amp;amp;type=song&amp;amp;id=1300528275&quot;}&lt;/p&gt;
&lt;p&gt;&quot;She&apos;s sweet but a psycho&quot;——又甜又疯的旋律，太上头了。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;7. 乱世巨星&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;陈小春&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;::music{meting=&quot;https://meting.spr-aachen.com/api?server=netease&amp;amp;type=song&amp;amp;id=4878122&quot;}&lt;/p&gt;
&lt;p&gt;&quot;叱咤风云我任意闯万众仰望&quot;——古惑仔的经典，男人味拉满。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;8. 天下&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;张杰&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;::music{meting=&quot;https://meting.spr-aachen.com/api?server=netease&amp;amp;type=song&amp;amp;id=1465225544&quot;}&lt;/p&gt;
&lt;p&gt;&quot;烽烟起寻爱似浪淘沙&quot;——张杰的武侠风代表作，大气磅礴。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;9. 水手&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;郑智化&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;::music{meting=&quot;https://meting.spr-aachen.com/api?server=netease&amp;amp;type=song&amp;amp;id=190381&quot;}&lt;/p&gt;
&lt;p&gt;&quot;他说风雨中这点痛算什么，擦干泪不要怕，至少我们还有梦&quot;——永远的励志经典。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;10. 海阔天空&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Beyond&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;::music{meting=&quot;https://meting.spr-aachen.com/api?server=netease&amp;amp;type=song&amp;amp;id=1357375695&quot;}&lt;/p&gt;
&lt;p&gt;&quot;原谅我这一生不羁放纵爱自由&quot;——无需多言，华语乐坛最伟大的歌曲之一。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;11. 红日&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;李克勤&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;::music{meting=&quot;https://meting.spr-aachen.com/api?server=netease&amp;amp;type=song&amp;amp;id=115502&quot;}&lt;/p&gt;
&lt;p&gt;&quot;命运就算颠沛流离，命运就算曲折离奇&quot;——正能量满满，听了就有力量。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;12. 烂泥&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;许志安&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;::music{meting=&quot;https://meting.spr-aachen.com/api?server=netease&amp;amp;type=song&amp;amp;id=411314656&quot;}&lt;/p&gt;
&lt;p&gt;&quot;愿可做你脚下那堆烂泥&quot;——林夕的词，卑微到骨子里的深情。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;💬 写在最后&lt;/h2&gt;
&lt;p&gt;这 12 首歌是我最近反复在听的，有燃的、有柔的、有经典的、有新潮的。如果你也有好歌推荐，欢迎在评论区留言互相分享！🎧&lt;/p&gt;
</content:encoded><category>生活分享</category><category>音乐</category><category>歌单</category><category>推荐</category></item><item><title>洗脚城初体验：一个纯情少年的&quot;足&quot;迹之旅</title><link>https://niuhaoyu.xyz/posts/first-foot-massage/</link><guid isPermaLink="true">https://niuhaoyu.xyz/posts/first-foot-massage/</guid><description>活了二十多年第一次踏进洗脚城，从进门社死到泡脚真香，再到被技师按出&quot;体检报告&quot;——一个纯情少年的足疗初体验全记录。</description><pubDate>Tue, 26 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;一、缘起&lt;/h2&gt;
&lt;p&gt;活了二十多年，江湖上关于&quot;洗脚城&quot;的传说听了无数——&lt;/p&gt;
&lt;p&gt;有人说那是谈生意的第二战场，有人说那是比家里沙发还舒服的地方，还有人说……咳，反正说什么的都有。&lt;/p&gt;
&lt;p&gt;作为一个从未踏足过洗脚城的&quot;纯情少年&quot;，我终于在今天鼓起勇气，决定亲自去一探究竟。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;毕竟，人生总要有很多第一次嘛。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://images.unsplash.com/photo-1544161515-4ab6ce6db874?fm=jpg&amp;amp;w=800&amp;amp;q=80&quot; alt=&quot;温馨足疗包厢环境&quot; /&gt;
&lt;em&gt;想象中的洗脚城包厢，大概就是这样的吧？&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;二、进门：社恐人的地狱开局&lt;/h2&gt;
&lt;p&gt;推开那扇玻璃门的一瞬间，我差点转身就走。&lt;/p&gt;
&lt;p&gt;为什么？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;前台小姐姐笑脸相迎：&quot;先生您好！有预约吗？&quot;&lt;/li&gt;
&lt;li&gt;我：&quot;呃……没、没有……&quot;&lt;/li&gt;
&lt;li&gt;小姐姐笑得更灿烂了：&quot;没关系，这边请~&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;然后我就被领到了一个宽敞的大厅，装修得金碧辉煌，空气中飘着淡淡的精油香气。&lt;/p&gt;
&lt;p&gt;这氛围感，怎么说呢——比我预想的要正经一万倍。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://images.unsplash.com/photo-1600334089648-b0d9d3028eb2?fm=jpg&amp;amp;w=800&amp;amp;q=80&quot; alt=&quot;大厅休息区&quot; /&gt;
&lt;em&gt;大厅休息区，比我想象中豪华多了&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;三、选项目：选择困难症发作&lt;/h2&gt;
&lt;p&gt;接待的小姐姐递过来一本菜单……&lt;strong&gt;不，是项目单&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;我看了一眼，好家伙：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;💧 &lt;strong&gt;经典足浴&lt;/strong&gt;（¥98）—— 基础款，适合小白&lt;/li&gt;
&lt;li&gt;🌿 &lt;strong&gt;中药足浴&lt;/strong&gt;（¥128）—— 养生党首选&lt;/li&gt;
&lt;li&gt;💎 &lt;strong&gt;至尊豪华足疗套餐&lt;/strong&gt;（¥298）—— 这是大佬的项目&lt;/li&gt;
&lt;li&gt;🧖 &lt;strong&gt;全身SPA+足疗&lt;/strong&gt;（¥398）—— ……我还没准备好&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;作为一个体面人，当然是选 &lt;strong&gt;经典足浴&lt;/strong&gt; 啦。来都来了，先体验一下基础操作。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;四、泡脚：比想象中舒服一万倍&lt;/h2&gt;
&lt;p&gt;换好拖鞋（那拖鞋还挺软乎），我被带进了一个灯光温暖的包间，两张按摩椅并排放着。一位技师大哥（幸好是大哥，不然我更紧张）走了进来，端着热气腾腾的木桶。&lt;/p&gt;
&lt;p&gt;桶里飘着几片艾草和姜片，热水冒着氤氲的蒸汽。&lt;/p&gt;
&lt;p&gt;&quot;先生，水温合适吗？&quot;
&quot;……合适合适。&quot;
（其实烫得脚趾头都在打架，但我不敢说😭）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://images.unsplash.com/photo-1515377905703-c4788e51af15?fm=jpg&amp;amp;w=800&amp;amp;q=80&quot; alt=&quot;泡脚与按摩&quot; /&gt;
&lt;em&gt;就是这个感觉！泡进去的一瞬间，整个人都化了&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;过了一会儿脚适应了水温，那种温热从脚底蔓延到全身的感觉……怎么说呢，就像冬天钻进刚晒过的被窝，又像喝下第一口热汤，&lt;strong&gt;整个人一下子就松了&lt;/strong&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;五、按摩：笑与痛的边缘&lt;/h2&gt;
&lt;p&gt;泡了大概二十分钟，技师大哥开始上钟了。&lt;/p&gt;
&lt;p&gt;他先是用毛巾把我的脚擦干，然后涂上按摩精油，开始按脚底的穴位。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;我发誓，那一刻我差点叫出声。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;不是舒服的——是 &lt;strong&gt;痛&lt;/strong&gt;！&lt;/p&gt;
&lt;p&gt;&quot;啊！轻点轻点！&quot;
&quot;先生，这里是你的肝反射区，说明你肝火有点旺啊，平时熬夜吧？&quot;
&quot;……你怎么知道的？&quot;&lt;/p&gt;
&lt;p&gt;他又按到另一个地方。
&quot;啊！&quot;
&quot;这里对应你的胃，吃饭不规律吧？&quot;
&quot;…………&quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;原来洗脚城才是最好的体检中心。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;你的身体哪里不好，技师一按就知道了，根本不用去医院。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://images.unsplash.com/photo-1661592144572-fti5c0b4ab3e?fm=jpg&amp;amp;w=800&amp;amp;q=80&quot; alt=&quot;专业足疗按摩&quot; /&gt;
&lt;em&gt;专业足疗按摩，痛并快乐着&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;按着按着，痛感退去，取而代之的是一种难以言喻的酸爽。像是一个结被解开了，一股暖流从脚底往上窜。那一刻我终于理解了——&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;那些天天往洗脚城跑的中年男人，不是去洗脚的，是去续命的。&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;六、最后的最后&lt;/h2&gt;
&lt;p&gt;全程大概80分钟，从进门到出门。&lt;/p&gt;
&lt;p&gt;走出洗脚城的时候，我感觉自己走路都轻了三斤，脚下像踩了棉花一样轻飘飘的。&lt;/p&gt;
&lt;p&gt;回头看了一眼那闪闪发光的招牌，我心里默默说了一句：
&lt;strong&gt;&quot;对不起，以前是我太年轻了。下周我还来。&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;以上就是本纯情少年的洗脚城初体验报告。结论：真香。&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>生活</category><category>生活</category><category>随笔</category><category>生活体验</category></item><item><title>自动部署测试</title><link>https://niuhaoyu.xyz/posts/auto-deploy-test/</link><guid isPermaLink="true">https://niuhaoyu.xyz/posts/auto-deploy-test/</guid><description>这是一篇用于测试 GitHub Webhook 自动部署流程的文章。如果能正常看到它，说明整套自动化部署管线已经跑通了！</description><pubDate>Tue, 26 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;🚀 自动部署测试&lt;/h2&gt;
&lt;p&gt;如果你能看到这篇文章，说明以下所有环节都正常工作：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;graph TD
    A[本地 git push] --&amp;gt; B[GitHub 收到推送]
    B --&amp;gt; C[Webhook 通知服务器]
    C --&amp;gt; D[服务器 git pull]
    D --&amp;gt; E[pnpm build]
    E --&amp;gt; F[替换静态文件]
    F --&amp;gt; G[✅ 部署成功]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;✅ 验证清单&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;步骤&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;th&gt;状态&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;📤 本地提交&lt;/td&gt;
&lt;td&gt;&lt;code&gt;git add&lt;/code&gt; + &lt;code&gt;git commit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;☁️ 推送到 GitHub&lt;/td&gt;
&lt;td&gt;&lt;code&gt;git push&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔔 Webhook 触发&lt;/td&gt;
&lt;td&gt;GitHub → 服务器&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📥 拉取代码&lt;/td&gt;
&lt;td&gt;&lt;code&gt;git pull&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔨 构建项目&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pnpm build&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🚚 替换静态文件&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mv dist/*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;blockquote&gt;
&lt;p&gt;🎉 &lt;strong&gt;自动部署管线测试通过！&lt;/strong&gt; 以后再也不用手动部署了。&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>测试</category><category>测试</category><category>技术</category></item><item><title>520，送自己一个手柄</title><link>https://niuhaoyu.xyz/posts/520-controller/</link><guid isPermaLink="true">https://niuhaoyu.xyz/posts/520-controller/</guid><description>520 不送别人，送自己一个手柄，快乐自己给~</description><pubDate>Wed, 20 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;520，送自己一个手柄&lt;/h1&gt;
&lt;p&gt;今天是 520，满大街都是送花送礼物给别人的。但谁说 520 只能送给别人呢？&lt;/p&gt;
&lt;p&gt;我决定——&lt;strong&gt;送自己一个手柄&lt;/strong&gt; 🎮&lt;/p&gt;
&lt;h2&gt;开箱初印象&lt;/h2&gt;
&lt;p&gt;到手的第一感觉就是：&lt;strong&gt;这分量，值了！&lt;/strong&gt; 包装很扎实，打开之后手柄的质感比想象中还要好。握持手感很舒服，按键反馈清脆，摇杆顺滑度也不错。&lt;/p&gt;
&lt;p&gt;这个价位的国产手柄，做工真的超出预期。接上电脑试了试，即插即用，延迟完全感觉不到。&lt;/p&gt;
&lt;h2&gt;为什么是今天？&lt;/h2&gt;
&lt;p&gt;其实手柄早就想买了，一直犹豫。正好赶上 520——谈什么恋爱，不如打游戏。&lt;/p&gt;
&lt;p&gt;与其花钱请别人吃饭、送别人礼物，不如给自己添一套实实在在的装备。毕竟：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;手柄是握在手里的快乐，谁也拿不走。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;玩什么？&lt;/h2&gt;
&lt;p&gt;接下来准备用手柄通关几个吃灰已久的游戏：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;动作类游戏终于不用键盘按到手抽筋了&lt;/li&gt;
&lt;li&gt;赛车游戏扳机键手感拉满&lt;/li&gt;
&lt;li&gt;有空再重温一遍《黑神话》&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;写在最后&lt;/h2&gt;
&lt;p&gt;520，有人送花，有人送包，我送自己一个手柄。&lt;/p&gt;
&lt;p&gt;对自己好一点，不需要等别人来送。想要的快乐，自己给自己。&lt;/p&gt;
&lt;p&gt;Happy 520 🎮&lt;/p&gt;
</content:encoded><category>生活分享 / 游戏 / 数码</category><category>游戏</category></item><item><title>用ai做了个2048小游戏，来试试吧</title><link>https://niuhaoyu.xyz/posts/2048games/</link><guid isPermaLink="true">https://niuhaoyu.xyz/posts/2048games/</guid><description>AI智能2048小游戏，支持手动/自动模式，3种算法可选</description><pubDate>Sun, 03 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;在线直接玩&lt;/h1&gt;
&lt;p&gt;👇 点击下方按钮，打开独立页面玩游戏&lt;/p&gt;
&lt;p&gt;&amp;lt;a href=&quot;http://162.211.183.142/games/game1/&quot; target=&quot;_blank&quot; style=&quot;display: inline-block; padding: 12px 28px; background: #2ecc71; color: #fff; text-decoration: none; border-radius: 10px; font-size: 18px; font-weight: bold; box-shadow: 0 4px 12px rgba(0,0,0,0.15); transition: all 0.3s ease;&quot;&amp;gt;
🎮 点击开始游戏&lt;/p&gt;
&lt;p&gt;&amp;lt;/a&amp;gt;&lt;/p&gt;
&lt;h1&gt;游戏介绍&lt;/h1&gt;
&lt;p&gt;一个用 Deepseek-v4-Flash + Charry studio 智能体制作的&lt;strong&gt;智能2048游戏&lt;/strong&gt;。
支持&lt;strong&gt;手动模式&lt;/strong&gt;和&lt;strong&gt;自动模式&lt;/strong&gt;，内置 &lt;strong&gt;3 种智能算法&lt;/strong&gt;，快来试试吧！&lt;/p&gt;
&lt;p&gt;欢迎在评论区留下你的最高分数！&lt;/p&gt;
</content:encoded><category>小游戏</category><category>2048</category><category>AI小游戏</category><category>自动玩2048</category></item></channel></rss>