<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Hi, Kainy</title>
  
  
  <link href="/atom.xml" rel="self"/>
  
  <link href="https://blogs.kainy.cn/"/>
  <updated>2026-08-01T09:28:07.942Z</updated>
  <id>https://blogs.kainy.cn/</id>
  
  <author>
    <name>Kainy Guo</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>Windows 工作电脑上，multica 通过自定义运行时，连接局域网内 Linux 中运行的 Devin-cli 智能体</title>
    <link href="https://blogs.kainy.cn/2026/07/multica-devin-bridge-guide/"/>
    <id>https://blogs.kainy.cn/2026/07/multica-devin-bridge-guide/</id>
    <published>2026-07-20T22:20:17.000Z</published>
    <updated>2026-08-01T09:28:07.942Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一、背景"><a href="#一、背景" class="headerlink" title="一、背景"></a>一、背景</h2><p>Devin CLI 是 Cognition 推出的命令行编码智能体，支持 ACP（Agent Client Protocol）协议，可被任何 ACP-aware 客户端作为子进程驱动，通过 stdin/stdout 交换 JSON-RPC 消息。</p><p>multica 是一个多智能体运行时管理器，能在同一台机器上统一调度多种编码智能体（Claude、Codex、Copilot、Hermes 等）。它在 Windows 上以 daemon 形式常驻，启动时会扫描 PATH，确认至少存在一个它认识的 agent CLI，然后按 profile 配置 exec 对应的可执行文件。</p><p>实际工作中常见这样一种拓扑：</p><ul><li>工作机是 Windows，multica 装在这里，方便用 Web UI 统一管理。</li><li>Devin CLI 装在局域网内一台 Linux 上（开发环境、算力、凭证都在那边），不想在 Windows 上再装一份。</li></ul><p>目标是让 Windows 上的 multica 把 Linux 上的 Devin 当成一个本地运行时来调度。</p><a id="more"></a><h2 id="二、原理"><a href="#二、原理" class="headerlink" title="二、原理"></a>二、原理</h2><p>核心难点是：multica daemon 只会用 <code>exec.Command</code> 在本机启动可执行文件，不会跨机调用；而 Devin CLI 在另一台 Linux 上。解决办法是利用 ACP 协议”JSON-RPC over stdio”的特性——stdio 可以被 SSH 透明转发，于是跨机调用在协议层等价于本地调用。</p><p>整条链路如下：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">Windows:</span> <span class="string">multica</span> <span class="string">daemon</span> <span class="string">──exec──&gt;</span> <span class="string">hermes.cmd</span> <span class="string">──ssh──&gt;</span> <span class="attr">Linux:</span> <span class="string">devin</span> <span class="string">acp</span></span><br><span class="line">        <span class="string">(按白名单扫PATH)</span>         <span class="string">(wrapper转发stdio)</span>    <span class="string">(强制命令，JSON-RPC</span> <span class="string">over</span> <span class="string">stdio)</span></span><br></pre></td></tr></table></figure><p>分三层解决三个问题：</p><h3 id="1-协议层：ACP-over-stdio-天然可转发"><a href="#1-协议层：ACP-over-stdio-天然可转发" class="headerlink" title="1. 协议层：ACP over stdio 天然可转发"></a>1. 协议层：ACP over stdio 天然可转发</h3><p><code>devin acp</code> 子命令启动一个 ACP server，通过 stdin/stdout 收发 JSON-RPC 消息，不依赖任何 socket、端口、PTY。SSH 的默认行为就是把远端进程的 stdio 接到本地，所以 <code>ssh user@host devin acp</code> 在协议上和直接 <code>devin acp</code> 完全等价。multica 只看到本地一个子进程的 stdio，无需任何改造。</p><h3 id="2-安全层：SSH-强制命令限制密钥能力"><a href="#2-安全层：SSH-强制命令限制密钥能力" class="headerlink" title="2. 安全层：SSH 强制命令限制密钥能力"></a>2. 安全层：SSH 强制命令限制密钥能力</h3><p>daemon 是无人值守后台进程，不能用交互式密码登录，必须用密钥。但这把密钥如果泄露，攻击者就能 SSH 进 Linux 执行任意命令，风险不可接受。解决办法是在 Linux 的 <code>~/.ssh/authorized_keys</code> 里给这把公钥加 <code>command=&quot;...&quot;</code> 强制命令：</p><figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">no</span>-port-forwarding,<span class="keyword">no</span>-X11-forwarding,<span class="keyword">no</span>-agent-forwarding,<span class="keyword">no</span>-pty,<span class="keyword">command</span>=<span class="string">"/home/guotao/.local/bin/devin acp"</span> ssh-ed25519 AAAA... devin-multica-bridge</span><br></pre></td></tr></table></figure><p>这样无论 SSH 客户端在命令行写什么，远端都只执行 <code>devin acp</code>，其它一律忽略。配合 <code>no-pty,no-port-forwarding,...</code> 等限制，这把钥匙被锁死成”只能启动 Devin ACP server”的单功能钥匙，泄露风险可控。</p><h3 id="3-发现层：借白名单名字过-daemon-预检"><a href="#3-发现层：借白名单名字过-daemon-预检" class="headerlink" title="3. 发现层：借白名单名字过 daemon 预检"></a>3. 发现层：借白名单名字过 daemon 预检</h3><p>multica daemon 启动时有一个硬编码白名单预检：<code>claude, codebuddy, codex, copilot, opencode, deveco, openclaw, hermes, pi, cursor-agent, kimi, kiro-cli, agy, qodercli, traecli, grok</code>。PATH 上一个都不认识就直接退出，profile 配置再正确也救不回来。<code>devin</code> / <code>devin-acp</code> 不在白名单里。</p><p>解决办法是借 <code>hermes</code> 这个名字——它本身是个通用协议族名，不是某个具体产品，适合作为自定义运行时的载体。把 wrapper 文件命名为 <code>hermes.cmd</code>，profile 的 <code>--command-name</code> 也用 <code>hermes</code>，daemon 预检就能找到、放行。wrapper 内部内容不变，仍然是 SSH 转发到 <code>devin acp</code>。</p><h2 id="三、完整步骤"><a href="#三、完整步骤" class="headerlink" title="三、完整步骤"></a>三、完整步骤</h2><h3 id="Linux-侧（一次性准备）"><a href="#Linux-侧（一次性准备）" class="headerlink" title="Linux 侧（一次性准备）"></a>Linux 侧（一次性准备）</h3><h4 id="1-确认-sshd-运行且-devin-可用"><a href="#1-确认-sshd-运行且-devin-可用" class="headerlink" title="1. 确认 sshd 运行且 devin 可用"></a>1. 确认 sshd 运行且 devin 可用</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">systemctl status sshd | head -5</span><br><span class="line">ss -tlnp | grep <span class="string">':22\b'</span></span><br><span class="line"><span class="built_in">which</span> devin                          <span class="comment"># 期望: /home/guotao/.local/bin/devin</span></span><br><span class="line">timeout 5 devin acp &lt; /dev/null      <span class="comment"># 期望: 看到 ACP server 启动日志后退出</span></span><br></pre></td></tr></table></figure><h4 id="2-生成专用密钥对（无-passphrase）"><a href="#2-生成专用密钥对（无-passphrase）" class="headerlink" title="2. 生成专用密钥对（无 passphrase）"></a>2. 生成专用密钥对（无 passphrase）</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh-keygen -t ed25519 -f /tmp/devin-multica -N <span class="string">""</span> -C <span class="string">"devin-multica-bridge"</span> -q</span><br></pre></td></tr></table></figure><h4 id="3-装入-authorized-keys，带强制命令与限制"><a href="#3-装入-authorized-keys，带强制命令与限制" class="headerlink" title="3. 装入 authorized_keys，带强制命令与限制"></a>3. 装入 authorized_keys，带强制命令与限制</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">mkdir -p ~/.ssh &amp;&amp; chmod 700 ~/.ssh</span><br><span class="line">touch ~/.ssh/authorized_keys &amp;&amp; chmod 600 ~/.ssh/authorized_keys</span><br><span class="line"></span><br><span class="line">PUB=$(cat /tmp/devin-multica.pub)</span><br><span class="line">LINE=<span class="string">"no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command=\"/home/guotao/.local/bin/devin acp\" <span class="variable">$&#123;PUB&#125;</span>"</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 去重：若已存在同注释的行先删掉</span></span><br><span class="line">grep -v <span class="string">"devin-multica-bridge$"</span> ~/.ssh/authorized_keys &gt; ~/.ssh/authorized_keys.tmp || <span class="literal">true</span></span><br><span class="line">mv ~/.ssh/authorized_keys.tmp ~/.ssh/authorized_keys</span><br><span class="line"><span class="built_in">echo</span> <span class="string">"<span class="variable">$LINE</span>"</span> &gt;&gt; ~/.ssh/authorized_keys</span><br><span class="line">chmod 600 ~/.ssh/authorized_keys</span><br></pre></td></tr></table></figure><h4 id="4-修复家目录权限（sshd-StrictModes-要求）"><a href="#4-修复家目录权限（sshd-StrictModes-要求）" class="headerlink" title="4. 修复家目录权限（sshd StrictModes 要求）"></a>4. 修复家目录权限（sshd StrictModes 要求）</h4><p>sshd 默认开启 <code>StrictModes</code>，家目录若对 group/other 可写（如 777），会拒绝使用 authorized_keys。收窄到 755 即可，无需 sudo：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">chmod g-w,o-w ~</span><br><span class="line">ls -ld ~          <span class="comment"># 期望: drwxr-xr-x</span></span><br></pre></td></tr></table></figure><h4 id="5-验证强制命令生效"><a href="#5-验证强制命令生效" class="headerlink" title="5. 验证强制命令生效"></a>5. 验证强制命令生效</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 用这把钥匙发任意危险命令，应被强制改成 devin acp</span></span><br><span class="line">timeout 4 ssh -i /tmp/devin-multica -o StrictHostKeyChecking=no -o BatchMode=yes localhost <span class="string">"cat /etc/shadow; rm -rf /"</span> &lt; /dev/null 2&gt;&amp;1 | head -5</span><br></pre></td></tr></table></figure><p>期望输出是 Devin ACP server 的启动日志（<code>Starting ACP server</code>），而不是 <code>shadow</code> 文件内容——说明强制命令把任意命令都拦截了。</p><h4 id="6-记录连接信息"><a href="#6-记录连接信息" class="headerlink" title="6. 记录连接信息"></a>6. 记录连接信息</h4><ul><li>主机：局域网 IP（如 <code>192.168.9.101</code>，优先）/ 公网 IP（如 <code>113.98.232.61</code>）</li><li>用户：<code>guotao</code></li><li>端口：22</li><li>私钥文件：<code>/tmp/devin-multica</code>（内容要传到 Windows）</li></ul><h3 id="Windows-侧（PowerShell，每步可复现）"><a href="#Windows-侧（PowerShell，每步可复现）" class="headerlink" title="Windows 侧（PowerShell，每步可复现）"></a>Windows 侧（PowerShell，每步可复现）</h3><h4 id="第-1-步：保存私钥"><a href="#第-1-步：保存私钥" class="headerlink" title="第 1 步：保存私钥"></a>第 1 步：保存私钥</h4><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$key</span> = <span class="string">@'</span></span><br><span class="line"><span class="string">-----BEGIN OPENSSH PRIVATE KEY-----</span></span><br><span class="line"><span class="string">（粘贴 Linux 上 /tmp/devin-multica 的完整内容）</span></span><br><span class="line"><span class="string">-----END OPENSSH PRIVATE KEY-----</span></span><br><span class="line"><span class="string">'@</span></span><br><span class="line"><span class="variable">$dir</span> = <span class="string">"<span class="variable">$env:USERPROFILE</span>\.ssh"</span></span><br><span class="line"><span class="built_in">New-Item</span> <span class="literal">-ItemType</span> Directory <span class="literal">-Force</span> <span class="literal">-Path</span> <span class="variable">$dir</span> | <span class="built_in">Out-Null</span></span><br><span class="line"><span class="variable">$key</span> | <span class="built_in">Set-Content</span> <span class="literal">-Path</span> <span class="string">"<span class="variable">$dir</span>\devin-multica"</span> <span class="literal">-Encoding</span> ascii <span class="literal">-NoNewline</span></span><br></pre></td></tr></table></figure><h4 id="第-2-步：锁紧私钥权限"><a href="#第-2-步：锁紧私钥权限" class="headerlink" title="第 2 步：锁紧私钥权限"></a>第 2 步：锁紧私钥权限</h4><p>Windows 自带 <code>ssh.exe</code> 和 Linux 一样严格，私钥若能被其他用户读会拒绝使用：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$k</span> = <span class="string">"<span class="variable">$env:USERPROFILE</span>\.ssh\devin-multica"</span></span><br><span class="line">icacls <span class="variable">$k</span> /inheritance:r</span><br><span class="line">icacls <span class="variable">$k</span> /grant:r <span class="string">"<span class="variable">$</span>(<span class="variable">$env:USERNAME</span>):(R)"</span></span><br><span class="line">icacls <span class="variable">$k</span>        <span class="comment"># 确认只剩你自己一条</span></span><br></pre></td></tr></table></figure><h4 id="第-3-步：建-wrapper-目录并加入-PATH"><a href="#第-3-步：建-wrapper-目录并加入-PATH" class="headerlink" title="第 3 步：建 wrapper 目录并加入 PATH"></a>第 3 步：建 wrapper 目录并加入 PATH</h4><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$dir</span> = <span class="string">"<span class="variable">$env:USERPROFILE</span>\.local\bin"</span></span><br><span class="line"><span class="built_in">New-Item</span> <span class="literal">-ItemType</span> Directory <span class="literal">-Force</span> <span class="literal">-Path</span> <span class="variable">$dir</span> | <span class="built_in">Out-Null</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 永久加入用户 PATH</span></span><br><span class="line"><span class="variable">$userPath</span> = [<span class="type">Environment</span>]::GetEnvironmentVariable(<span class="string">"Path"</span>,<span class="string">"User"</span>)</span><br><span class="line"><span class="keyword">if</span> (<span class="variable">$userPath</span> <span class="operator">-notlike</span> <span class="string">"*<span class="variable">$dir</span>*"</span>) &#123;</span><br><span class="line">    [<span class="type">Environment</span>]::SetEnvironmentVariable(<span class="string">"Path"</span>, <span class="string">"<span class="variable">$userPath</span>;<span class="variable">$dir</span>"</span>, <span class="string">"User"</span>)</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment"># 当前会话立即生效</span></span><br><span class="line"><span class="variable">$env:Path</span> += <span class="string">";<span class="variable">$dir</span>"</span></span><br></pre></td></tr></table></figure><h4 id="第-4-步：创建-hermes-cmd-wrapper"><a href="#第-4-步：创建-hermes-cmd-wrapper" class="headerlink" title="第 4 步：创建 hermes.cmd wrapper"></a>第 4 步：创建 hermes.cmd wrapper</h4><p><strong>关键：文件名必须是 <code>hermes</code>（在 multica 白名单里），不是 <code>devin-acp</code>。</strong> IP 用你实测能连通的那个，局域网优先。</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$linuxHost</span> = <span class="string">"192.168.9.101"</span>   <span class="comment"># 不通就换公网 IP</span></span><br><span class="line"><span class="string">@"</span></span><br><span class="line"><span class="string">@echo off</span></span><br><span class="line"><span class="string">ssh -i "%USERPROFILE%\.ssh\devin-multica" -o StrictHostKeyChecking=accept-new -o BatchMode=yes -o ConnectTimeout=10 guotao@<span class="variable">$linuxHost</span></span></span><br><span class="line"><span class="string">"@</span> | <span class="built_in">Set-Content</span> <span class="literal">-Path</span> <span class="string">"<span class="variable">$dir</span>\hermes.cmd"</span> <span class="literal">-Encoding</span> ascii</span><br><span class="line"></span><br><span class="line"><span class="built_in">Get-Content</span> <span class="string">"<span class="variable">$dir</span>\hermes.cmd"</span>   <span class="comment"># 验证内容</span></span><br></pre></td></tr></table></figure><p>要点：</p><ul><li>wrapper 里不带任何远端命令参数——Linux 侧的强制命令会自动把它变成 <code>devin acp</code>，无论 SSH 客户端发什么。</li><li><code>-o BatchMode=yes</code> 保证 daemon 无人值守时不会因任何交互提示卡死。</li><li><code>-o ConnectTimeout=10</code> 防止网络问题时 daemon 永久挂起。</li></ul><h4 id="第-5-步：测试-wrapper-端到端"><a href="#第-5-步：测试-wrapper-端到端" class="headerlink" title="第 5 步：测试 wrapper 端到端"></a>第 5 步：测试 wrapper 端到端</h4><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&amp; <span class="string">"<span class="variable">$env:USERPROFILE</span>\.local\bin\hermes.cmd"</span></span><br></pre></td></tr></table></figure><p>期望输出：<br><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">PTY allocation request failed on channel 0</span><br><span class="line"><span class="built_in">..</span>. <span class="builtin-name">INFO</span> chisel: <span class="attribute">version</span>=... <span class="attribute">binary</span>=devin startup</span><br><span class="line"><span class="built_in">..</span>. <span class="builtin-name">INFO</span> chisel_server::acp: Starting ACP server</span><br><span class="line"><span class="built_in">..</span>. <span class="builtin-name">INFO</span> chisel_server::acp: ACP<span class="built_in"> server </span>PID: <span class="built_in">..</span>.</span><br></pre></td></tr></table></figure></p><p>然后挂起等输入，<code>Ctrl+C</code> 退出。看到这个就说明 SSH + 强制命令 + ACP over stdio 全链路通了。</p><p>常见问题：</p><ul><li><code>Permission denied (publickey)</code> → 第 2 步权限没锁紧，重做 icacls</li><li><code>Connection timed out</code> → 换 IP 重写 wrapper</li><li><code>UNPROTECTED PRIVATE KEY FILE</code> → 同上，权限问题</li></ul><h4 id="第-6-步：把-multica-永久化（可选但推荐）"><a href="#第-6-步：把-multica-永久化（可选但推荐）" class="headerlink" title="第 6 步：把 $multica 永久化（可选但推荐）"></a>第 6 步：把 $multica 永久化（可选但推荐）</h4><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> (<span class="operator">-not</span> (<span class="built_in">Test-Path</span> <span class="variable">$PROFILE</span>)) &#123; <span class="built_in">New-Item</span> <span class="literal">-ItemType</span> File <span class="literal">-Path</span> <span class="variable">$PROFILE</span> <span class="literal">-Force</span> | <span class="built_in">Out-Null</span> &#125;</span><br><span class="line"><span class="built_in">Add-Content</span> <span class="literal">-Path</span> <span class="variable">$PROFILE</span> <span class="literal">-Value</span> <span class="string">'$multica = "C:\Users\Administrator\AppData\Local\Programs\@multicadesktop\resources\app.asar.unpacked\resources\bin\multica.exe"'</span></span><br><span class="line">. <span class="variable">$PROFILE</span></span><br><span class="line"><span class="variable">$multica</span>   <span class="comment"># 验证</span></span><br></pre></td></tr></table></figure><h4 id="第-7-步：创建-multica-runtime-profile"><a href="#第-7-步：创建-multica-runtime-profile" class="headerlink" title="第 7 步：创建 multica runtime profile"></a>第 7 步：创建 multica runtime profile</h4><p><strong>关键：<code>--command-name hermes</code>，不是 <code>devin-acp</code>。</strong> daemon 预检按白名单扫 PATH，<code>hermes</code> 在白名单里，<code>devin-acp</code> 不在。</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">&amp; <span class="variable">$multica</span> runtime profile create `</span><br><span class="line">  -<span class="literal">-display</span><span class="literal">-name</span> <span class="string">"Devin"</span> `</span><br><span class="line">  -<span class="literal">-protocol</span><span class="literal">-family</span> hermes `</span><br><span class="line">  -<span class="literal">-command</span><span class="literal">-name</span> hermes `</span><br><span class="line">  -<span class="literal">-description</span> <span class="string">"Devin via SSH+ACP"</span></span><br></pre></td></tr></table></figure><p>记下返回的 profile-id（下面用 <code>&lt;ID&gt;</code> 代替）。</p><h4 id="第-8-步：钉死绝对路径（绕开-daemon-PATH-解析）"><a href="#第-8-步：钉死绝对路径（绕开-daemon-PATH-解析）" class="headerlink" title="第 8 步：钉死绝对路径（绕开 daemon PATH 解析）"></a>第 8 步：钉死绝对路径（绕开 daemon PATH 解析）</h4><p>daemon 被桌面端拉起时继承的 PATH 比交互式 PowerShell 窄，用 <code>set-path</code> 给绝对路径最稳。<strong>单行写，不要用反引号续行</strong>（反引号后不能有任何字符，否则续行失效）：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&amp; <span class="variable">$multica</span> runtime profile <span class="built_in">set-path</span> &lt;ID&gt; -<span class="literal">-path</span> <span class="string">"C:\Users\Administrator\.local\bin\hermes.cmd"</span></span><br></pre></td></tr></table></figure><h4 id="第-9-步：重启-daemon-并验证"><a href="#第-9-步：重启-daemon-并验证" class="headerlink" title="第 9 步：重启 daemon 并验证"></a>第 9 步：重启 daemon 并验证</h4><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">&amp; <span class="variable">$multica</span> daemon restart</span><br><span class="line">&amp; <span class="variable">$multica</span> daemon status</span><br></pre></td></tr></table></figure><p><code>daemon status</code> 应显示 <code>running</code>，agents 列表里出现 hermes/Devin。</p><h4 id="第-10-步：Web-UI-确认"><a href="#第-10-步：Web-UI-确认" class="headerlink" title="第 10 步：Web UI 确认"></a>第 10 步：Web UI 确认</h4><p>打开 Multica Web UI → Runtimes，应看到 Devin 自定义运行时显示「在线」。</p><h2 id="四、踩过的两个坑"><a href="#四、踩过的两个坑" class="headerlink" title="四、踩过的两个坑"></a>四、踩过的两个坑</h2><h3 id="坑-1：PowerShell-反引号续行"><a href="#坑-1：PowerShell-反引号续行" class="headerlink" title="坑 1：PowerShell 反引号续行"></a>坑 1：PowerShell 反引号续行</h3><p>反引号 <code>`</code> 后面不能有任何字符（包括空格），否则续行不生效，命令被拆成两半，第二行被当成新语句报 <code>Missing expression after unary operator &#39;--&#39;</code>。长命令一律单行写，或用括号续行。</p><h3 id="坑-2：command-name-必须是白名单里的名字"><a href="#坑-2：command-name-必须是白名单里的名字" class="headerlink" title="坑 2：command-name 必须是白名单里的名字"></a>坑 2：command-name 必须是白名单里的名字</h3><p>daemon 启动预检是硬编码白名单扫描，<code>devin-acp</code> 不在名单里，无论怎么 <code>set-path</code> 都过不了预检，daemon 直接退出 1。借 <code>hermes</code> 这个通用协议族名字，wrapper 内容不变，就能过预检。这是整个方案能成立的关键一招。</p><h2 id="五、验证清单"><a href="#五、验证清单" class="headerlink" title="五、验证清单"></a>五、验证清单</h2><table><thead><tr><th>项</th><th>命令</th><th>预期</th></tr></thead><tbody><tr><td>私钥权限</td><td><code>icacls &quot;$env:USERPROFILE\.ssh\devin-multica&quot;</code></td><td>只有你自己一条</td></tr><tr><td>wrapper 能跑</td><td><code>&amp; &quot;$env:USERPROFILE\.local\bin\hermes.cmd&quot;</code></td><td>ACP server 启动日志</td></tr><tr><td>profile 已注册</td><td><code>&amp; $multica runtime profile list</code></td><td><code>COMMAND_NAME=hermes</code></td></tr><tr><td>daemon 运行</td><td><code>&amp; $multica daemon status</code></td><td><code>running</code></td></tr><tr><td>Web UI</td><td>Multica → Runtimes</td><td>Devin 显示在线</td></tr></tbody></table><h2 id="六、安全说明"><a href="#六、安全说明" class="headerlink" title="六、安全说明"></a>六、安全说明</h2><ul><li>专用密钥对独立于个人 SSH 密钥，泄露影响面只限于”启动 Devin ACP server”。</li><li>强制命令 + <code>no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding</code> 把这把钥匙锁成单功能钥匙，无法用于其它任何操作。</li><li>私钥在 Windows 上用 icacls 锁到仅本人可读，避免被同机其它用户盗用。</li><li>通信走 SSH 加密通道，ACP 协议内容（含 Devin 凭证）不裸传。</li><li>如需进一步收紧，可在 Linux 侧用 <code>iptables</code>/<code>ufw</code> 限制 22 端口来源 IP 为 Windows 工作机的固定地址。</li></ul>]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;一、背景&quot;&gt;&lt;a href=&quot;#一、背景&quot; class=&quot;headerlink&quot; title=&quot;一、背景&quot;&gt;&lt;/a&gt;一、背景&lt;/h2&gt;&lt;p&gt;Devin CLI 是 Cognition 推出的命令行编码智能体，支持 ACP（Agent Client Protocol）协议，可被任何 ACP-aware 客户端作为子进程驱动，通过 stdin/stdout 交换 JSON-RPC 消息。&lt;/p&gt;
&lt;p&gt;multica 是一个多智能体运行时管理器，能在同一台机器上统一调度多种编码智能体（Claude、Codex、Copilot、Hermes 等）。它在 Windows 上以 daemon 形式常驻，启动时会扫描 PATH，确认至少存在一个它认识的 agent CLI，然后按 profile 配置 exec 对应的可执行文件。&lt;/p&gt;
&lt;p&gt;实际工作中常见这样一种拓扑：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;工作机是 Windows，multica 装在这里，方便用 Web UI 统一管理。&lt;/li&gt;
&lt;li&gt;Devin CLI 装在局域网内一台 Linux 上（开发环境、算力、凭证都在那边），不想在 Windows 上再装一份。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;目标是让 Windows 上的 multica 把 Linux 上的 Devin 当成一个本地运行时来调度。&lt;/p&gt;
    
    </summary>
    
      <category term="学习笔记" scheme="https://blogs.kainy.cn/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
      <category term="建站❤编程" scheme="https://blogs.kainy.cn/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E5%BB%BA%E7%AB%99%E2%9D%A4%E7%BC%96%E7%A8%8B/"/>
    
    
      <category term="multica" scheme="https://blogs.kainy.cn/tags/multica/"/>
    
  </entry>
  
  <entry>
    <title>什么是 GEO 领域的“品牌降噪”？</title>
    <link href="https://blogs.kainy.cn/2026/07/%E4%BB%80%E4%B9%88%E6%98%AF%20GEO%20%E9%A2%86%E5%9F%9F%E7%9A%84%E2%80%9C%E5%93%81%E7%89%8C%E9%99%8D%E5%99%AA%E2%80%9D%EF%BC%9F/"/>
    <id>https://blogs.kainy.cn/2026/07/什么是 GEO 领域的“品牌降噪”？/</id>
    <published>2026-07-12T07:11:13.000Z</published>
    <updated>2026-08-01T09:28:07.945Z</updated>
    
    <content type="html"><![CDATA[<h2 id="什么是-GEO-领域的“品牌降噪”？"><a href="#什么是-GEO-领域的“品牌降噪”？" class="headerlink" title="什么是 GEO 领域的“品牌降噪”？"></a>什么是 GEO 领域的“品牌降噪”？</h2><p>在 <strong>GEO（Generative Engine Optimization，生成式引擎优化）</strong>领域，<strong>“品牌降噪”（Brand Denoising）</strong> 是指：<strong>清理、统一并结构化品牌在全网的数字足迹，消除会让 AI 大语言模型（LLM）产生混淆、幻觉或负面评价的“数据噪音”，从而确保 AI 能够精准、正面且高频地向用户推荐该品牌。</strong></p><p>简单来说，传统 SEO 是做给搜索引擎的关键词算法看的，而 GEO 的“品牌降噪”是<strong>为了给 AI 投喂“高纯度”的语料</strong>。</p><a id="more"></a><h3 id="🔍-为什么需要“品牌降噪”？（AI-眼中的“噪音”是什么）"><a href="#🔍-为什么需要“品牌降噪”？（AI-眼中的“噪音”是什么）" class="headerlink" title="🔍 为什么需要“品牌降噪”？（AI 眼中的“噪音”是什么）"></a>🔍 为什么需要“品牌降噪”？（AI 眼中的“噪音”是什么）</h3><p>当 AI 搜索（如 Perplexity、ChatGPT、Kimi、AI Overviews 等）通过 RAG（检索增强生成）等技术去全网抓取并总结品牌信息时，如果网络上充斥着“噪音”，AI 就无法构建出准确的<strong>实体知识图谱（Entity Knowledge Graph）</strong>。</p><p>在 GEO 的语境下，典型的“品牌噪音”主要包括：</p><ul><li><strong>事实性信息冲突</strong>：例如官网已经更新了最新一代产品的功能，但各大技术论坛或媒体上依然留存着大量关于旧版本缺陷的讨论（这会导致 AI 生成过时或错误的产品信息）。</li><li><strong>非结构化的语意模糊</strong>：品牌公关稿件中堆砌了大量空洞的营销词汇（如“赋能”、“颠覆”），缺乏清晰的核心卖点（USP）和技术指标。AI 抓不到重点，就会认为该品牌没有实质参考价值，从而降低推荐权重。</li><li><strong>负面与同名杂音</strong>：高权重平台上的负面评价，或是与品牌名称重名的其他无关事物。这些信息会干扰大模型的实体识别，导致生成的回答错乱甚至带有负面倾向。</li></ul><hr><h3 id="🛠️-“品牌降噪”的核心执行逻辑"><a href="#🛠️-“品牌降噪”的核心执行逻辑" class="headerlink" title="🛠️ “品牌降噪”的核心执行逻辑"></a>🛠️ “品牌降噪”的核心执行逻辑</h3><p>对于技术和营销团队而言，品牌降噪本质上是一项<strong>算法适配与语料重构工程</strong>：</p><ol><li><strong>收拢定义权（建立防御性定义）</strong><br>如果品牌不主动用高度结构化的语言定义自己，AI 就会根据全网的碎片信息随机拼凑。降噪的第一步是在高权重节点（如官网、官方技术博客、百科、GitHub 库等）上，用逻辑严密、AI 偏好的格式统一品牌定位。</li><li><strong>数据结构化与格式对齐</strong><br>将杂乱的文本转化为对机器友好的结构。例如，在代码中规范部署 Schema 标记（如 <code>JSON-LD</code>），提供清晰的 FAQ（问答对）和 API 文档。这能帮助 AI 爬虫更轻松地解析页面，将品牌与特定问题进行“实体绑定”。</li><li><strong>清洗历史遗留数据</strong><br>下架、修改或通过发布更高权重的最新官方声明，来覆盖网络上过时或自相矛盾的内容。确保不同渠道（技术文档、产品手册、媒体报道）对外输出的底层逻辑高度一致。</li><li><strong>提供高信噪比（High SNR）内容</strong><br>减少无意义的修辞，增加包含具体数据、深度原理解析、且排版清晰（多用列表、Markdown 语法层级）的高质量干货，大幅提升品牌内容被 AI 选为“底层参考引用源”的概率。</li></ol><hr><h3 id="💡-总结"><a href="#💡-总结" class="headerlink" title="💡 总结"></a>💡 总结</h3><p>如果把 AI 大模型比作一个拥有超强算力但极度依赖上下文的系统，<strong>“品牌降噪”就是帮品牌在这个系统里“洗去杂念，注入清晰统一的记忆”</strong>。它是企业布局 GEO 策略的基石——只有先完成降噪，让大模型不再对品牌产生“幻觉”或“误解”，后续的 AI 推荐与引用率提升才能水到渠成。</p>]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;什么是-GEO-领域的“品牌降噪”？&quot;&gt;&lt;a href=&quot;#什么是-GEO-领域的“品牌降噪”？&quot; class=&quot;headerlink&quot; title=&quot;什么是 GEO 领域的“品牌降噪”？&quot;&gt;&lt;/a&gt;什么是 GEO 领域的“品牌降噪”？&lt;/h2&gt;&lt;p&gt;在 &lt;strong&gt;GEO（Generative Engine Optimization，生成式引擎优化）&lt;/strong&gt;领域，&lt;strong&gt;“品牌降噪”（Brand Denoising）&lt;/strong&gt; 是指：&lt;strong&gt;清理、统一并结构化品牌在全网的数字足迹，消除会让 AI 大语言模型（LLM）产生混淆、幻觉或负面评价的“数据噪音”，从而确保 AI 能够精准、正面且高频地向用户推荐该品牌。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;简单来说，传统 SEO 是做给搜索引擎的关键词算法看的，而 GEO 的“品牌降噪”是&lt;strong&gt;为了给 AI 投喂“高纯度”的语料&lt;/strong&gt;。&lt;/p&gt;
    
    </summary>
    
      <category term="学习笔记" scheme="https://blogs.kainy.cn/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
      <category term="学而时嘻" scheme="https://blogs.kainy.cn/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E5%AD%A6%E8%80%8C%E6%97%B6%E5%98%BB/"/>
    
    
      <category term="GEO" scheme="https://blogs.kainy.cn/tags/GEO/"/>
    
      <category term="品牌" scheme="https://blogs.kainy.cn/tags/%E5%93%81%E7%89%8C/"/>
    
  </entry>
  
  <entry>
    <title>把凝视的权力交还给大众：「一起展」的产品美学解构</title>
    <link href="https://blogs.kainy.cn/2026/06/%E6%8A%8A%E5%87%9D%E8%A7%86%E7%9A%84%E6%9D%83%E5%8A%9B%E4%BA%A4%E8%BF%98%E7%BB%99%E5%A4%A7%E4%BC%97%EF%BC%9A%E3%80%8C%E4%B8%80%E8%B5%B7%E5%B1%95%E3%80%8D%E7%9A%84%E4%BA%A7%E5%93%81%E7%BE%8E%E5%AD%A6%E8%A7%A3%E6%9E%84/"/>
    <id>https://blogs.kainy.cn/2026/06/把凝视的权力交还给大众：「一起展」的产品美学解构/</id>
    <published>2026-06-13T04:16:26.000Z</published>
    <updated>2026-08-01T09:28:07.953Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>利用业余时间，第一个正儿八经参与的App艺术成分这么高🎉。多亏创始人Anniezhang的信念和鼓舞，这波 VibeCoding 潜能被挖掘的很充分，高度还原了@lsj出色设计。</p></blockquote><blockquote><p>遗憾的是，由于各中原因，后续大概不会继续参与App开发。一路走来回忆满满，有趣的好笑的，熬过的夜，聊作朋友小聚茶余饭后的一点谈资。这篇内容主体之前就写好，应Annie建议，App发布后公开。巧合的是一起展App在我生日这一天过审上架AppStore，感兴趣可以下载体验。</p></blockquote><blockquote><p>App终归要迭代升级，打算在开发机上打个标本包，把接口数据保存到本地，固化当前应用形态，权当留念吧，哈哈。以下是正文：</p></blockquote><p>在AIGC（人工智能生成内容）日益充斥的今天，一起展App上汇聚的人文艺术力量，显得愈发可贵。</p><h2 id="一场开在客厅里的「数字美术馆」"><a href="#一场开在客厅里的「数字美术馆」" class="headerlink" title="一场开在客厅里的「数字美术馆」"></a>一场开在客厅里的「数字美术馆」</h2><p>钟先生的手机相册中，躺着几百张女儿在白纸上的涂鸦。</p><a id="more"></a><p>过去，他只能习惯性地把这些照片发在朋友圈，然后看着它们短短几小时内就被热搜、短视频和广告淹没。在信息流里，那些稚嫩线条只是随波逐流的数字碎片。</p><p>直到他点开了「一起展」的生活秀。</p><p>让钟先生感到意外惊喜的是，没有繁琐的步骤和认证门槛，他体验了平台「一分钟创建展览」功能——当他再次审视那些涂鸦时，它们不再是从前那单调的九宫格图片，而是置入一个个带有空间透视感的线上展厅。系统为每一张涂鸦自动渲染了逼真的画框材质、装饰垫颜色，和细腻的厚度阴影。在精心挑选的背景音乐中，缓缓流淌呈现。</p><p>每个生活秀都拥有属于自己的专属展位，并且永久留存。</p><p>涂鸦作品不再是一条需要快速滑过的「动态」，而是一场名为《五岁半的客厅毕加索》的、可以被认真凝视的「展览」。</p><p>此刻，印象中高高在上的策展特权彻底下放。「一起展」对生活秀的定位十分清晰：展览的一种轻量化表达，让用户将日常创作以展览的形式呈现，降低正式策展的仪式感和操作门槛。</p><p>这不再是单纯的功能迭代，更是内容表达权力的下放——</p><blockquote><p><strong>用技术的手段，为普通人的日常，赋予「被凝视」的尊严。</strong></p></blockquote><p>跳出这个温情的故事，以行业视角来审视当下 App 生态，不得不接受令人略感无力的真相：过去十几年，几乎所有产品都在疯狂优化「流」的效率。图文瀑布流、全屏短视频流……本质上都是冰冷冷的传送带，一切内容任由时间轴裹挟，在下划滚动钟，用完即走，看完即焚。</p><p>而「一起展」选择了一条与之截然相反的路线——</p><blockquote><p><strong>避开在时间轴上的内卷，转而在二维平面上，建立一种立体的「场域感」。</strong></p></blockquote><hr><h2 id="介质｜当别人还在压榨「流」的加载速度时，一起展已然开始构建「空间」引力"><a href="#介质｜当别人还在压榨「流」的加载速度时，一起展已然开始构建「空间」引力" class="headerlink" title="介质｜当别人还在压榨「流」的加载速度时，一起展已然开始构建「空间」引力"></a>介质｜当别人还在压榨「流」的加载速度时，一起展已然开始构建「空间」引力</h2><p>在当下互联网语境里，图片被降维成一张张干瘪的卡片，强塞到双列瀑布流网格中。这种设计的出发点只有一个：以最高的空间利用率，换取用户最快的划动速度。</p><p>而「一起展」则认为——</p><blockquote><p><strong>艺术品不应被「划过」，而应该被「凝视」</strong></p></blockquote><p>为了重建这种凝视感，团队在二维的手机空间上进行了一场反常规的空间设计创新。当用户发布展览时，系统并非简单地将图片排成一列。而是在发布页的全景预览中，根据作品数量与尺寸，动态布局展位。</p><p>展现在用户眼前的，不再是一张悬浮在屏幕上的 <code>.jpeg</code>，而转为一个有着空间透视效果的物理场域。</p><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2026/05/mpe6xxvy.webp" alt></p><p>为了平衡性能与视觉体验，平台引入了智能多级渲染机制。不同场景按需加载不同尺寸图片，绝不因为节省流量而牺牲作品的画面质感。</p><p>这是一次向扁平信息流的宣战：线上展览的终局，不止步于简单的图片排列，更是空间与审美的无损还原。</p><hr><h2 id="技术｜最高级的代码不该被看见，它应该化为展位上那道恰到好处的画框阴影"><a href="#技术｜最高级的代码不该被看见，它应该化为展位上那道恰到好处的画框阴影" class="headerlink" title="技术｜最高级的代码不该被看见，它应该化为展位上那道恰到好处的画框阴影"></a>技术｜最高级的代码不该被看见，它应该化为展位上那道恰到好处的画框阴影</h2><p>德国哲学家本雅明曾感叹，机械复制时代的艺术品失去了它的「灵光（Aura）」。</p><p>「一起展」正试图用技术的手段，在数字世界里找回这种灵光。</p><p>底层空间渲染引擎不仅还原了展厅透视，还通过高精度材质算法为每一幅作品生成了专属画框——材质贴图、装饰垫颜色、厚度、阴影，一样不少。与底层复杂的材质渲染形成鲜明对比的，是 UI 层面的极度克制。</p><p>如果你去过世界顶级的当代美术馆，就会发现它们的墙壁通常是纯色且空无一物的。只有当环境足够纯净，艺术品的张力才能得到最大化。</p><p>「一起展」完美内化了这种「留白」的智慧。</p><p>在沉浸式观展模式中，团队大刀阔斧地砍掉了各种干扰注意力的花哨设计：</p><p><strong>【信息降噪】</strong> 展厅信息卡片去除了伸缩头，仅保留更小的缩略图横向列表。选中时甚至隐藏了「x号厅」的字样，把信息噪音压到最低。</p><p><strong>【视觉退让】</strong> 策展人的姓名只做加粗处理，去掉了互联网产品中常见的下划线和高亮样式。阅读，因此变得更加专注。</p><p><strong>【物理防遮挡】</strong> 为了避免交互控件喧宾夺主，自动预览蒙层被<strong>精确控制在安全边界内</strong>，严格避开底部的点赞、评论、收藏操作栏。用户视野的纯粹，是由一行行代码守护的。</p><p>技术在这里保持了极致的克制。最好的 UI 从不喧宾夺主，它只是托起内容的那面安静的背景墙。</p><hr><h2 id="专注｜在注意力被无限切割的时代，我们要做的不是大声喧哗，而是建造一座允许灵魂驻足的数字美术馆"><a href="#专注｜在注意力被无限切割的时代，我们要做的不是大声喧哗，而是建造一座允许灵魂驻足的数字美术馆" class="headerlink" title="专注｜在注意力被无限切割的时代，我们要做的不是大声喧哗，而是建造一座允许灵魂驻足的数字美术馆"></a>专注｜在注意力被无限切割的时代，我们要做的不是大声喧哗，而是建造一座允许灵魂驻足的数字美术馆</h2><p>视觉构筑了空间的骨架，声音则赋予空间灵魂。</p><p>在「一起展」这样混合图文、视频、音频展览的多媒体社区中，如何合理管理音效，决定了沉浸感与心流体验的成败。</p><p>移动设备的物理规则决定同一时刻只能有一个音频焦点。许多应用粗暴抢夺，导致声音撕裂与混乱。「一起展」植入了它的“杜比降噪系统”——由底层音乐服务与播放协调器构成的无形指挥家，智能规划每一段音轨的优先级。</p><p>当用户为看清画作细节而进入放大预览时，系统会触发一次听觉的“主动降噪”：环境音乐如潮水般优雅退去，留出绝对的静默，让你屏息凝视。而当退出放大模式、重返展厅视角的瞬间，背景音乐再次从静默中浮现，完成无缝的声场重建。</p><p>在这里，「静音」不是播放故障，而是一种主动的听觉设计。它完美模拟了人在物理世界中屏息凝神，凑近一幅画时的专注状态。</p><p>不仅如此。在纯粹的音频展览播放页中，为了让听觉体验不显单调，团队基于音频封面图，运用高强度的高斯模糊将其晕染为全屏的氛围底色。悬浮于上的播放卡片，仿佛置身于声音的波光之中。</p><p>视觉在为听觉让路。听觉又在反哺视觉的纵深。</p><hr><h2 id="创作｜把卢浮宫的展厅装进手机，只需一分钟；把普通人的日常变成艺术，只需一个念头"><a href="#创作｜把卢浮宫的展厅装进手机，只需一分钟；把普通人的日常变成艺术，只需一个念头" class="headerlink" title="创作｜把卢浮宫的展厅装进手机，只需一分钟；把普通人的日常变成艺术，只需一个念头"></a>创作｜把卢浮宫的展厅装进手机，只需一分钟；把普通人的日常变成艺术，只需一个念头</h2><p>所有的技术先锋，最终都要走向人文觉醒。</p><p>如果说空间计算和听觉心流是「一起展」重构数字场域的手段，那么它真正想重新定义的则是用户关系。</p><p>艺术界有一个著名的「白盒子（White Cube）」理论——那些洁白、安静、高高在上的现代美术馆展厅。长期以来，传统策展被束缚在这些白盒子里，成为极少数精英阶层的专属特权，伴随着高昂的场地租金、繁琐的布展流程与苛刻的作品筛选。</p><p>「一起展」的出现，正在温柔地消解“白盒子”的这层壁垒。</p><p>除了星瀚声宴、城市风貌、非遗文化、微博物馆、微艺术馆、名人讲堂等专业展览采用邀约制外，「一起展」的其他模块如生活秀相册等，都面向大众开放。</p><p>这极大降低了策展门槛。你不需要深厚的艺术背景，不需要支付昂贵的场租，只需一部手机，就能搭建属于自己的线上展厅。这不止是产品功能层面的创新，更是平台将艺术表达权，彻底交还给大众的平权运动。</p><p>产品哲学中最浓墨重彩的一笔，非「生活秀」模块莫属。</p><p>在传统认知里，「展览」天然意味着宏大叙事与严肃创作。「一起展」将生活秀定义为展览的一种轻量表达，打破了这个刻板印象。</p><p>看似微不足道的日常生活，在 一起展App 中被赋予了前所未有的仪式感——周末的一次普通露营、精心准备的一顿晚餐、雨后的街角——都能在 App 里化为展览，设置专属的封面，以及明确的展览信息。从而摆脱信息流中存活数小时后就被淹没，快餐式动态的命运。成为聚光灯下，享受驻足和凝视的展品。</p><p>生活秀正在重构普通人记录生活的方式——</p><blockquote><p><strong>柴米油盐的日常，同样值得一场盛大的展出</strong></p></blockquote><hr><h2 id="远景｜构建永续共生的美学社区"><a href="#远景｜构建永续共生的美学社区" class="headerlink" title="远景｜构建永续共生的美学社区"></a>远景｜构建永续共生的美学社区</h2><p><strong>推动普惠策展</strong>，是「一起展」出发点。同时我们也深知：一个各得其所、自我造血的完备生态，是愿景持续推进的保障。**</p><p>未来，一起展App 将向更深邃、更垂直的维度演进。为了给不同领域的表达者建造专属的精神重镇，「一起展」将把这片数字场域划分为三大专业象限：</p><ul><li><strong>【星瀚声宴】</strong>：这是为为明星、专业博主、网红量身定制的视听流光殿堂。在这里，星光与声浪不再是快餐式的娱乐消费，而是通过沉浸式美学，重构为可被长久凝视的璀璨星光。</li><li><strong>【微科技】</strong>：是属于科技从业者与爱好者的灵感极客舱。它将硬核的前沿科技、底层代码的浪漫，解构为指尖上可以被感知、把玩的数字微光。</li><li><strong>【名人讲坛】</strong>：这是为各行业专家学者筑起的思想瞭望塔。它将厚重的学术沉淀、严肃的知识火花引入数字艺术的殿堂，让理性的光芒在普罗大众可见的视野里中静静回荡。</li></ul><p>—<strong>一个伟大的数字广场，既要有街角生活秀的烟火气，也要有仰望星空的瞭望塔与沉思的思想殿堂。</strong></p><p>然而，单纯的情怀无法撑起一座永恒的馆宇，任何美好构想。首先必须回答创作者的生存命题。</p><p>我们正在设计一套精密的<strong>生态奖赏机制</strong>。它旨在打破传统互联网平台“用流量盘剥创作者”的宿命，让知识的火花、才艺的绽放以及思想的布施，通过制度化的规则，直接转化为推动创作者持续生长的现实能量。</p><p><strong>“真正的商业化闭环，不是对流量的涸泽而渔，而是让理想主义者有尊严地生存，让每一份才华都收到真实世界的回馈。”</strong></p><p>当创作者通过空间的才艺展示获得对等的现实收益，当用户的精神共鸣转化为正向的生态养分，一个真正健康、良性自造血的「一起展」数字美学社区才算真正落成。在这里，商业化成为美学的护城河，它不引入喧嚣，而只为创作者的才华永续赋能。</p><p>在算法催生，万物流逝的当下。仍有平凡的日常，值得一个永不谢幕的展厅。</p><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2026/05/mpe6x3tg.webp" alt></p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;利用业余时间，第一个正儿八经参与的App艺术成分这么高🎉。多亏创始人Anniezhang的信念和鼓舞，这波 VibeCoding 潜能被挖掘的很充分，高度还原了@lsj出色设计。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;遗憾的是，由于各中原因，后续大概不会继续参与App开发。一路走来回忆满满，有趣的好笑的，熬过的夜，聊作朋友小聚茶余饭后的一点谈资。这篇内容主体之前就写好，应Annie建议，App发布后公开。巧合的是一起展App在我生日这一天过审上架AppStore，感兴趣可以下载体验。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;App终归要迭代升级，打算在开发机上打个标本包，把接口数据保存到本地，固化当前应用形态，权当留念吧，哈哈。以下是正文：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在AIGC（人工智能生成内容）日益充斥的今天，一起展App上汇聚的人文艺术力量，显得愈发可贵。&lt;/p&gt;
&lt;h2 id=&quot;一场开在客厅里的「数字美术馆」&quot;&gt;&lt;a href=&quot;#一场开在客厅里的「数字美术馆」&quot; class=&quot;headerlink&quot; title=&quot;一场开在客厅里的「数字美术馆」&quot;&gt;&lt;/a&gt;一场开在客厅里的「数字美术馆」&lt;/h2&gt;&lt;p&gt;钟先生的手机相册中，躺着几百张女儿在白纸上的涂鸦。&lt;/p&gt;
    
    </summary>
    
      <category term="学习笔记" scheme="https://blogs.kainy.cn/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
      <category term="建站❤编程" scheme="https://blogs.kainy.cn/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E5%BB%BA%E7%AB%99%E2%9D%A4%E7%BC%96%E7%A8%8B/"/>
    
    
      <category term="产品" scheme="https://blogs.kainy.cn/tags/%E4%BA%A7%E5%93%81/"/>
    
      <category term="一起展" scheme="https://blogs.kainy.cn/tags/%E4%B8%80%E8%B5%B7%E5%B1%95/"/>
    
      <category term="解构" scheme="https://blogs.kainy.cn/tags/%E8%A7%A3%E6%9E%84/"/>
    
  </entry>
  
  <entry>
    <title>用设计语言解读「一起展」App 技术理念与产品哲学的映射</title>
    <link href="https://blogs.kainy.cn/2026/05/%E7%94%A8%E8%AE%BE%E8%AE%A1%E8%AF%AD%E8%A8%80%E8%A7%A3%E8%AF%BB%E3%80%8C%E4%B8%80%E8%B5%B7%E5%B1%95%E3%80%8DApp%20%E6%8A%80%E6%9C%AF%E7%90%86%E5%BF%B5%E4%B8%8E%E4%BA%A7%E5%93%81%E5%93%B2%E5%AD%A6%E7%9A%84%E6%98%A0%E5%B0%84/"/>
    <id>https://blogs.kainy.cn/2026/05/用设计语言解读「一起展」App 技术理念与产品哲学的映射/</id>
    <published>2026-05-20T04:16:26.000Z</published>
    <updated>2026-08-01T09:28:07.959Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>本文基于完整开发过程整理，力求还原每一处产品设计与技术实现的细节，供记忆与理念深挖。</p></blockquote><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2026/05/mpe6x3tg.webp" alt></p><h2 id="零、技术理念与产品哲学的映射"><a href="#零、技术理念与产品哲学的映射" class="headerlink" title="零、技术理念与产品哲学的映射"></a>零、技术理念与产品哲学的映射</h2><table><thead><tr><th>技术实现</th><th>产品/设计理念</th></tr></thead><tbody><tr><td>「一分钟创建展览」的快速布展</td><td>降低策展门槛，让艺术表达平民化</td></tr><tr><td>展厅透视+画框材质渲染</td><td>线上展览不是简单图片排列，而是空间与审美的还原</td></tr><tr><td>视频/音频/图文的多媒体混合</td><td>不同内容形态适配不同表达方式</td></tr><tr><td>笔记两级浏览（预览→全文）</td><td>尊重用户注意力，先吸引再深入</td></tr><tr><td>背景音乐与视频的音频焦点管理</td><td>细节处的沉浸感打磨</td></tr><tr><td>邀约办展机制</td><td>平台对优质内容的筛选与背书</td></tr><tr><td>实名认证前置</td><td>社区治理与内容可信度的基础建设</td></tr><tr><td>thumbnailLevel 分级加载</td><td>性能与体验的平衡，不因省流量牺牲画质</td></tr></tbody></table><a id="more"></a><h2 id="一、产品定位与架构概览"><a href="#一、产品定位与架构概览" class="headerlink" title="一、产品定位与架构概览"></a>一、产品定位与架构概览</h2><p>「一起展」是一款围绕<strong>展览、笔记、生活秀</strong>构建的内容社区与创作工具型 App。用户既可以浏览他人发布的展览与图文笔记，也可以通过「一分钟创建展览」快速搭建自己的线上展厅，形成从内容消费到内容生产的完整闭环。</p><p><strong>核心架构特征：</strong></p><ul><li><strong>模块化 Monorepo</strong>：采用 <code>apps/host_app</code> 壳工程 + <code>packages/features/*</code> 业务包拆分，严格遵循单向依赖（<code>apps → features → common → core</code>），业务包之间绝对隔离。</li><li><strong>状态管理</strong>：全面使用 <code>flutter_riverpod</code>（<code>StateNotifierProvider</code>、<code>AsyncNotifierProvider</code>、<code>StateProvider</code>），已完成从 Provider 的迁移。</li><li><strong>路由体系</strong>：基于 <code>go_router</code> 的统一命名路由，所有跨模块跳转通过 <code>core_router</code> 实现，禁止直接 import 目标页面类文件。</li><li><strong>媒体处理</strong>：视频使用 <code>video_player</code>，音频使用 <code>just_audio</code>，图片使用 <code>CachedNetworkImage</code>，本地媒体选取使用 <code>image_picker</code>。</li><li><strong>数据埋点</strong>：集成 Matomo 分析，页面进入、按钮点击、视频播放、发布漏斗等关键行为均带 <code>matomoTitle</code> 上报。</li></ul><hr><h2 id="二、启动与认证体系"><a href="#二、启动与认证体系" class="headerlink" title="二、启动与认证体系"></a>二、启动与认证体系</h2><h3 id="2-1-启动页（Splash）"><a href="#2-1-启动页（Splash）" class="headerlink" title="2.1 启动页（Splash）"></a>2.1 启动页（Splash）</h3><ul><li>纯品牌展示页，作为应用入口；完成后根据登录态决定跳转登录页或首页。</li></ul><h3 id="2-2-登录页（LoginPage）"><a href="#2-2-登录页（LoginPage）" class="headerlink" title="2.2 登录页（LoginPage）"></a>2.2 登录页（LoginPage）</h3><p><strong>设计亮点：</strong></p><ul><li><strong>沉浸式登录氛围</strong>：页面顶部使用全宽品牌背景图（<code>assets/icons/login/login_bg.png</code>），下方承载登录表单，视觉层次分明。</li><li><strong>双通道登录</strong>：支持「手机号 + 短信验证码」与「微信授权登录」两种方式。</li><li><strong>手机号输入细节</strong>：<ul><li>左侧固定展示 <code>+86</code> 区号选择器；</li><li>输入框底部边框随焦点状态动态变色（聚焦高亮蓝色，失焦灰色）；</li><li>支持一键清空输入（右侧 <code>clear</code> 图标）；</li><li>输入限制：仅数字、最多 11 位。</li></ul></li><li><strong>验证码输入细节</strong>：<ul><li>与手机号输入框共享一致的设计语言；</li><li>右侧「获取验证码」按钮带倒计时状态（<code>countdown</code>），发送中展示 <code>CircularProgressIndicator</code>；</li><li>倒计时期间按钮置灰并显示剩余秒数。</li></ul></li><li><strong>协议同意机制</strong>：登录按钮下方放置勾选框，必须勾选《用户协议》与《隐私政策》才能触发登录；文案可点击跳转对应协议页。未勾选时点击登录会弹出 <code>SnackBar</code> 提示。</li><li><strong>登录按钮</strong>：紫蓝渐变背景（<code>#6A11CB → #2575FC</code>），宽度铺满，圆角 8px；仅当手机号 11 位且验证码 6 位时才可点击。</li><li><strong>其他登录方式区</strong>：独立区块展示「其他登录方式」文案，居中放置微信图标按钮，点击唤起微信授权。</li><li><strong>登录后路由</strong>：登录成功优先 <code>pop</code> 返回上一页；若无上一页则 <code>pushReplacementNamed</code> 到首页。</li><li><strong>异常处理</strong>：捕获 <code>DioException</code>，对 <code>HandshakeException</code> 给出明确的「网络证书校验失败」提示，便于调试。</li></ul><h3 id="2-3-绑定手机号（BindPhonePage）"><a href="#2-3-绑定手机号（BindPhonePage）" class="headerlink" title="2.3 绑定手机号（BindPhonePage）"></a>2.3 绑定手机号（BindPhonePage）</h3><ul><li>微信登录后若后端返回 <code>NeedBindPhoneException</code>，强制引导至绑定手机号页，完成后方可进入主流程。</li></ul><h3 id="2-4-协议页（AgreementPage）"><a href="#2-4-协议页（AgreementPage）" class="headerlink" title="2.4 协议页（AgreementPage）"></a>2.4 协议页（AgreementPage）</h3><ul><li>支持《用户协议》与《隐私政策》两种类型，通过 <code>AgreementType</code> 枚举区分，纯文本展示。</li></ul><hr><h2 id="三、首页信息流（HomePage）"><a href="#三、首页信息流（HomePage）" class="headerlink" title="三、首页信息流（HomePage）"></a>三、首页信息流（HomePage）</h2><p>首页是整个 App 的核心流量入口，采用<strong>底部导航 + 顶部 Tab 双层结构</strong>。</p><h3 id="3-1-底部导航栏（4-大板块）"><a href="#3-1-底部导航栏（4-大板块）" class="headerlink" title="3.1 底部导航栏（4 大板块）"></a>3.1 底部导航栏（4 大板块）</h3><table><thead><tr><th>Tab</th><th>说明</th></tr></thead><tbody><tr><td>首页</td><td>信息流主阵地，含 6 个二级频道</td></tr><tr><td>办展</td><td>展览分类浏览与快速布展入口</td></tr><tr><td>邀约</td><td>活动/邀请函相关（预留入口）</td></tr><tr><td>我的</td><td>个人中心与内容管理</td></tr></tbody></table><p><strong>设计细节：</strong></p><ul><li>底部导航栏图标与文案配合，选中态有明确视觉反馈。</li><li>状态栏图标颜色自适应：当位于「视频」频道时，状态栏使用浅色图标（<code>Brightness.light</code>），其余频道使用深色图标（<code>Brightness.dark</code>），避免从视频/看展页返回后状态栏颜色残留导致白底不可见。</li><li>页面根节点包裹 <code>AnnotatedRegion&lt;SystemUiOverlayStyle&gt;</code>，确保系统 UI 风格与当前内容一致。</li></ul><h3 id="3-2-顶部频道-Tab（6-个频道）"><a href="#3-2-顶部频道-Tab（6-个频道）" class="headerlink" title="3.2 顶部频道 Tab（6 个频道）"></a>3.2 顶部频道 Tab（6 个频道）</h3><p><strong>推荐、视频、热展、直通车、关注、上海</strong></p><h4 id="3-2-1-推荐频道"><a href="#3-2-1-推荐频道" class="headerlink" title="3.2.1 推荐频道"></a>3.2.1 推荐频道</h4><ul><li>典型的瀑布流笔记列表，卡片高度不一，形成视觉节奏。</li><li>笔记卡片包含：封面图/视频、标题、作者头像与昵称、点赞数。</li><li>支持无限滚动加载，带骨架屏占位（<code>AppSkeletonHallGrid</code>）。</li></ul><h4 id="3-2-2-视频频道（HomeVideoTabPage）"><a href="#3-2-2-视频频道（HomeVideoTabPage）" class="headerlink" title="3.2.2 视频频道（HomeVideoTabPage）"></a>3.2.2 视频频道（HomeVideoTabPage）</h4><p><strong>核心体验设计：</strong></p><ul><li><strong>垂直 PageView 全屏视频流</strong>：模拟抖音/快手的沉浸式短视频体验，每个视频占满一屏。</li><li><strong>自定义滑动物理效果</strong>：<code>_ShortDragPageScrollPhysics</code> 允许更短的拖拽距离触发翻页，提升操作跟手性。</li><li><strong>视频预加载策略</strong>：开始播放约 5 秒后预热下一条视频，优先保证滑动切换时减少黑屏与卡顿。</li><li><strong>交互手势</strong>：<ul><li><strong>单击</strong>：播放/暂停切换；</li><li><strong>双击</strong>：触发点赞动画（红心浮起）；</li><li><strong>长按</strong>：触发倍速播放（2x/3x），松手恢复常速。</li></ul></li><li><strong>错误降级</strong>：视频加载失败时自动回退到封面图展示，避免黑屏。</li><li><strong>埋点</strong>：自动上报视频观看时长、播放错误率等事件。</li></ul><h4 id="3-2-3-热展频道"><a href="#3-2-3-热展频道" class="headerlink" title="3.2.3 热展频道"></a>3.2.3 热展频道</h4><ul><li>展示热门展览卡片，点击进入展览详情页（<code>ExhibitViewingPageTemplate1</code>）。</li><li>展览封面解析有专门策略：优先使用 <code>visitFileId</code> 作为海报；若展位首项为图片则海报+首张展位图轮播；若首项为视频则仅展示海报。</li></ul><h4 id="3-2-4-直通车-关注-上海"><a href="#3-2-4-直通车-关注-上海" class="headerlink" title="3.2.4 直通车 / 关注 / 上海"></a>3.2.4 直通车 / 关注 / 上海</h4><ul><li>直通车：平台精选或商业推广内容入口。</li><li>关注：展示已关注用户的动态。</li><li>上海：基于地域（上海）的内容聚合，体现本地化运营思路。</li></ul><h3 id="3-4-搜索入口"><a href="#3-4-搜索入口" class="headerlink" title="3.4 搜索入口"></a>3.4 搜索入口</h3><ul><li>首页顶部导航栏右侧带有搜索图标，点击触发 Matomo 埋点（<code>category: &#39;search&#39;, action: &#39;entry_click&#39;, name: &#39;home_headbar&#39;</code>）。</li><li>搜索功能当前为入口占位，后续可扩展为全局内容搜索（笔记/展览/用户）。</li></ul><h3 id="3-5-首页生命周期与数据一致性"><a href="#3-5-首页生命周期与数据一致性" class="headerlink" title="3.5 首页生命周期与数据一致性"></a>3.5 首页生命周期与数据一致性</h3><ul><li><strong>didPopNext 自动刷新</strong>：首页监听 <code>RouteObserver</code>，当用户从其他页面（如笔记详情、展览页、编辑页）返回时，自动触发当前 Tab 的数据刷新，确保点赞、关注、删除等操作的结果即时同步到列表。</li><li><strong>首次加载优化</strong>：Tab 切换时首次 <code>invalidate</code> 对应 Provider 触发加载；已加载过的 Tab 不重复请求，除非用户手动下拉刷新。</li><li><strong>状态栏动态适配</strong>：首页根节点包裹 <code>AnnotatedRegion&lt;SystemUiOverlayStyle&gt;</code>，视频 Tab 使用 <code>SystemUiOverlayStyle.light</code>，其余 Tab 使用 <code>SystemUiOverlayStyle.dark</code>，避免从视频/看展页返回后状态栏图标颜色残留导致白底不可见。</li></ul><h3 id="3-3-笔记创建（HomeCreateNotePage）"><a href="#3-3-笔记创建（HomeCreateNotePage）" class="headerlink" title="3.3 笔记创建（HomeCreateNotePage）"></a>3.3 笔记创建（HomeCreateNotePage）</h3><p><strong>设计亮点：</strong></p><ul><li><strong>媒体选择互斥</strong>：图片与视频不能同时存在，选中一类后另一类入口自动隐藏。</li><li><strong>富文本编辑</strong>：支持输入标题与正文，正文支持话题提取与插入（<code>#话题#</code> 形式）。</li><li><strong>草稿机制</strong>：支持保存草稿、加载草稿继续编辑，草稿数量在个人主页展示。</li><li><strong>隐私分级</strong>：「公开可见」改造为一级隐私选择 + 二级联系人选择抽屉：<ul><li>公开 / 互关可见 / 私密</li><li>部分可见 / 不让谁看：支持搜索联系人、多选、显示已选人数与确认回填。</li></ul></li><li><strong>位置标签</strong>：支持添加地理位置。</li><li><strong>发布流程</strong>：先上传媒体文件，拿到 <code>fileId</code> 后再调用发布接口，失败时保留草稿。</li></ul><hr><h2 id="四、办展与展览系统（Exhibit）"><a href="#四、办展与展览系统（Exhibit）" class="headerlink" title="四、办展与展览系统（Exhibit）"></a>四、办展与展览系统（Exhibit）</h2><p>这是 App 最具差异化的功能模块，将「线上策展」轻量化，让普通用户也能「一分钟创建展览」。</p><h3 id="4-1-办展分类页（ExhibitTabPage）"><a href="#4-1-办展分类页（ExhibitTabPage）" class="headerlink" title="4.1 办展分类页（ExhibitTabPage）"></a>4.1 办展分类页（ExhibitTabPage）</h3><p><strong>视觉设计：</strong></p><ul><li>顶部有大幅 Banner 背景图，文案「一分钟创建展览！」，右侧 CTA「立即办展」。</li><li>Banner 与下方内容区有重叠效果（<code>exhibitContentTopOverlap</code>），内容区以圆角（<code>exhibitContentTopRadius</code>）裁切浮起，形成卡片层叠感。</li><li><strong>分类导航</strong>：横向滚动的一级分类 Tab，带底部指示器（圆角小条）；下方有二级/三级分类 Chip 筛选。</li><li><strong>邀约角标</strong>：部分分类带有「邀约」角标，金橙渐变背景（<code>#FFD09D → #DE8220</code>），圆角不对称设计（左上/右上/右下圆角 6，左下圆角 2），精致且有辨识度。</li><li><strong>展馆瀑布流</strong>：选中分类后展示对应模板/展馆卡片，支持下拉刷新与上拉加载更多；无数据时展示「暂无展馆」空状态。</li><li><strong>列表底部</strong>：到达末尾时展示趣味文案「恭喜你发现了世界的尽头！🌈」配分割线，缓解无更多内容的失落感。</li><li><strong>实名提醒弹窗</strong>：双击 Banner CTA 区域触发「实名提醒」弹窗，引导用户完成实名认证解锁办展功能。</li></ul><h3 id="4-2-办展封面页（ExhibitCoverPageTemplate1）"><a href="#4-2-办展封面页（ExhibitCoverPageTemplate1）" class="headerlink" title="4.2 办展封面页（ExhibitCoverPageTemplate1）"></a>4.2 办展封面页（ExhibitCoverPageTemplate1）</h3><ul><li>展示单个模板/展馆的封面大图（全景图比例 <code>393:262</code>）、标题、关键词标签（橙色背景 <code>#FF8C00</code> 半透明）、推荐描述。</li><li>底部渐变遮罩 +「开始布展」大按钮，深蓝渐变（<code>#11317C → #1B46AA → #224598</code>）。</li><li><strong>邀约拦截</strong>：若当前模板所属分类标记为 <code>requiresInvitation=true</code>，点击「开始布展」不进入编辑，而是重置底部导航到办展 Tab 并回到首页。</li></ul><h3 id="4-3-快速布展（FastExhibitPage）"><a href="#4-3-快速布展（FastExhibitPage）" class="headerlink" title="4.3 快速布展（FastExhibitPage）"></a>4.3 快速布展（FastExhibitPage）</h3><p><strong>核心交互设计：</strong></p><ul><li><strong>多展厅管理</strong>：支持最多 6 个展厅，底部横向缩略图列表展示各厅；默认 1 号厅选中，右侧「新增展厅」按钮带加号叠加；仅允许删除非一号厅。</li><li><strong>展位作品管理</strong>：<ul><li>空展位：直接点击唤起媒体选择（图片）；</li><li>已填充展位：点击弹出蒙层，可选择「更换作品」或「编辑查看」；</li><li>长按/批量选择模式：支持多选后批量删除。</li></ul></li><li><strong>展厅切换</strong>：底部缩略图点击切换，主舞台实时加载对应展厅图片；空位不再回填默认图，保持真实创作状态。</li><li><strong>底部操作栏</strong>：居中分布「信息」「音乐」「清空」按钮，清晰易触。</li><li><strong>退出确认</strong>：返回时若存在未保存内容，弹窗询问「保存为草稿」或「放弃离开」。</li><li><strong>状态管理</strong>：使用 <code>FastExhibitDraftController</code>（<code>StateNotifier</code>）管理 <code>hallDrafts</code>，每个展厅独立维护 <code>entryLocalPath</code> 与 <code>boothLocalPaths</code>。</li></ul><h3 id="4-4-发布页（FastExhibitPublishPage）"><a href="#4-4-发布页（FastExhibitPublishPage）" class="headerlink" title="4.4 发布页（FastExhibitPublishPage）"></a>4.4 发布页（FastExhibitPublishPage）</h3><ul><li><strong>全景预览</strong>：上方展示当前选中展厅的透视效果，展位按模板 <code>boothList.length</code> 动态渲染（不再固定 5 个图位），支持画框材质、阴影、厚度。</li><li><strong>展厅缩略图切换</strong>：底部横向缩略图可切换预览不同展厅。</li><li><strong>表单信息</strong>：填写展览名称、推荐描述、选择定位、隐私设置。</li><li><strong>提交逻辑</strong>：<ul><li>先调用 <code>saveOrUpdate</code> 创建展览（<code>esQuantity = boothList.length * hallCount</code>，状态草稿=1/发布=2）；</li><li>拿到 <code>id</code> 后二次调用同接口编辑提交 <code>id/templateName/recommendDesc/fileId/isType/scopeUserIds/boothList</code>。</li></ul></li><li><strong>发布后路由</strong>：发布成功 → 首页「我的」Tab；保存草稿 → 草稿箱「展览」Tab。</li><li><strong>动态展位布局</strong>：<code>exhibit_wall_artworks_perspective.dart</code> 支持动态展位布局与可选 <code>frameDataList/frameMaterialUrls</code>，可渲染边框、阴影、厚度与材质。</li></ul><h3 id="4-5-展览浏览页（ExhibitViewingPageTemplate1）"><a href="#4-5-展览浏览页（ExhibitViewingPageTemplate1）" class="headerlink" title="4.5 展览浏览页（ExhibitViewingPageTemplate1）"></a>4.5 展览浏览页（ExhibitViewingPageTemplate1）</h3><p><strong>沉浸式看展体验：</strong></p><ul><li><strong>展厅信息卡</strong>：外框自上而下渐变并圆角 24，策展人姓名仅加粗（无蓝色下划线），去除花哨样式保持阅读专注。</li><li><strong>标题滚动动画</strong>：超长标题从右往左单向循环滚动，吸引注意力又不干扰整体布局。</li><li><strong>展厅分布</strong>：去掉伸缩头，仅保留更小缩略图横向列表，选中高亮且隐藏「x号厅」字样，减少信息噪音。</li><li><strong>主视觉区</strong>：图片/视频轮播，视频自动播放，图片支持手动滑动。</li><li><strong>画框与材质</strong>：每个展位作品根据 <code>ExhibitBoothFrameData</code> 渲染真实画框效果，含材质贴图、装饰垫颜色、厚度阴影。</li><li><strong>音乐播放</strong>：展厅支持背景音乐，右上角音乐按钮实底设计提高清晰度；进入作品详情或放大预览时自动暂停，返回后恢复，状态严格同步避免失步。</li><li><strong>弹幕</strong>：支持弹幕开关；关闭时以固定高度深色占位（<code>_DanmakuAreaPlaceholder</code>）避免背景发浅突兀。</li><li><strong>底部操作栏</strong>：左到右渐变背景，点赞/评论/收藏图标使用定制 SVG（<code>icon-exhibit-like.svg</code>、<code>icon-exhibit-comment.svg</code>）；点赞激活态为红色，收藏激活态为金色，视觉反馈鲜明。</li><li><strong>交互防遮挡</strong>：自动预览蒙层限制 <code>bottom</code> 为 <code>MediaQuery.padding.bottom + 64</code>，避免拦截底部操作栏的点击。</li><li><strong>点赞状态持久化</strong>：通过 Riverpod <code>noteEntityProvider</code> 维护展位点赞状态，离开页面再进入不丢失。</li></ul><h3 id="4-6-作品详情页（ExhibitArtworkDetailPageTemplate1）"><a href="#4-6-作品详情页（ExhibitArtworkDetailPageTemplate1）" class="headerlink" title="4.6 作品详情页（ExhibitArtworkDetailPageTemplate1）"></a>4.6 作品详情页（ExhibitArtworkDetailPageTemplate1）</h3><ul><li><strong>主舞台</strong>：在可见区域中垂直居中展示作品，带画框材质渲染；图片未加载时保留最小占位约束，加载完成后释放以自适应宽高比。</li><li><strong>视频作品</strong>：<code>fileType=2</code> 时主舞台缩略预览使用视频播放器（<code>thumbnailLevel=3</code>），支持播放控制；点击「查看超清」进入全屏视频播放器（<code>thumbnailLevel=0</code> 原视频）。</li><li><strong>横向滑动切换</strong>：左右滑动手势切换同一展厅内其他作品，过滤掉 <code>fileId</code> 为空的展位，仅在有实质内容的展位间跳转。</li><li><strong>底部缩略图轮播</strong>：展厅内多作品时，底部展示缩略图条，点击或滑动切换。</li><li><strong>作品信息弹窗</strong>：点击「信息」按钮从底部弹出 <code>AppModalSheet</code>，毛玻璃效果（<code>blurSigma: 10</code>），展示作品名称、作者、推荐描述。</li><li><strong>互动操作</strong>：点赞、评论、分享；点赞状态实时同步到全局实体仓库。</li></ul><h3 id="4-7-展览详情页模板（ExhibitDetailPageTemplate1）"><a href="#4-7-展览详情页模板（ExhibitDetailPageTemplate1）" class="headerlink" title="4.7 展览详情页模板（ExhibitDetailPageTemplate1）"></a>4.7 展览详情页模板（ExhibitDetailPageTemplate1）</h3><p><strong>另一种展览浏览形态，更偏向「展览介绍 + 作品概览」：</strong></p><ul><li><strong>背景沉浸</strong>：全屏背景图 + 60% 黑色遮罩，营造展厅暗环境氛围。</li><li><strong>顶部导航栏</strong>：白色返回/分享图标，居中展览标题。</li><li><strong>主展品轮播</strong>：<code>PageView.builder</code> 横向滑动，含 10 张展品图，<code>viewportFraction: 0.9</code> 让两侧露出下一张边缘；切换时触发 <code>AnimationController</code> 缩放动效，增强视觉反馈。</li><li><strong>缩略图导航</strong>：底部横向缩略图列表，选中项放大（45px）并带白色边框（2px），未选中项缩小（35px），点击可跳转对应页面。</li><li><strong>底部功能栏</strong>：5 个功能按钮（详情、播放、VR、全屏、分享），白色半透明玻璃质感背景（<code>alpha: 0.12</code>，边框 <code>alpha: 0.6</code>），圆角 6px。</li><li><strong>详情弹窗</strong>：点击「详情」唤起 <code>DraggableScrollableSheet</code>，初始高度 50%，最小 30%，最大 90%；<ul><li>顶部白色圆角面板，带系统指示条（灰色短横线）；</li><li>展厅介绍长文本，首行缩进 18px，段落间距 12px，两端对齐；</li><li>底部浮起「进入展厅」按钮，橙色渐变（<code>#FF9022</code>）+ 自定义 <code>ClipPath</code> 弧形裁切，两侧箭头图标引导点击。</li></ul></li></ul><h3 id="4-9-多种展览详情模板（Type-1-2-3）"><a href="#4-9-多种展览详情模板（Type-1-2-3）" class="headerlink" title="4.9 多种展览详情模板（Type 1 / 2 / 3）"></a>4.9 多种展览详情模板（Type 1 / 2 / 3）</h3><p><strong>产品意图</strong>：为不同展览类型提供差异化的浏览体验，体现「一展一风格」的策展理念。</p><p><strong>Type 1（智慧卡片）</strong>：</p><ul><li>暖米色背景（<code>#FFFFFAF0</code>），横向 <code>PageView</code> 展示 GIF 动图卡片，<code>viewportFraction: 0.85</code>；</li><li>卡片带缩放动效（非当前页缩小至 0.8），营造立体纵深感；</li><li>底部 <code>BackdropFilter</code> 毛玻璃控制栏，含缩略图导航（选中项带橙色边框 <code>#FF8F1F</code>）与功能按钮（标签/播放/VR/详情/全屏/分享）；</li><li>卡片底部叠加毛玻璃文字层，展示作品名称与作者。</li></ul><p><strong>Type 2（雕塑展览）</strong>：</p><ul><li>类似 Type 1 的横向轮播，但每张卡片展示雕塑作品大图 + 标题 + 详细描述；</li><li>更适合静态艺术品的深度介绍。</li></ul><p><strong>Type 3（画廊模式）</strong>：</p><ul><li>全屏背景图随当前选中作品实时切换，<code>extendBodyBehindAppBar: true</code> 让背景延伸至状态栏；</li><li><code>BackdropFilter</code> 高斯模糊背景图作为氛围层；</li><li>底部横向缩略图条，选中高亮。</li></ul><p><strong>3D 展厅（Exhibition3dPage）</strong>：</p><ul><li>当前为占位页（”3D view will be implemented here”），预留 WebGL/3D 引擎接入能力，未来可支持 360° 虚拟展厅漫游。</li></ul><h3 id="4-8-评论页（ExhibitArtworkCommentPageTemplate1）"><a href="#4-8-评论页（ExhibitArtworkCommentPageTemplate1）" class="headerlink" title="4.8 评论页（ExhibitArtworkCommentPageTemplate1）"></a>4.8 评论页（ExhibitArtworkCommentPageTemplate1）</h3><ul><li><strong>评论结构</strong>：支持一级评论与二级回复，嵌套展示；子评论默认展示前 2 条，超出时「查看全部 x 条评论」可展开。</li><li><strong>交互细节</strong>：<ul><li>每条评论展示头像、昵称、内容、时间；</li><li>支持回复、点赞、删除（仅自己的评论）；</li><li>评论点赞数实时更新；</li><li>时间显示智能格式化（刚刚、x分钟前、x小时前、x天前）。</li></ul></li><li><strong>输入框</strong>：底部悬浮输入栏，点击唤起全屏键盘输入 Sheet，带圆角与阴影；支持回复指定用户（<code>hintText: &#39;回复：$replyToNickName&#39;</code>）。</li><li><strong>空状态</strong>：无评论时展示「暂无评论，快来抢沙发吧」。</li><li><strong>加载更多</strong>：列表滚动到底部 80px 内自动加载更多。</li></ul><hr><h2 id="五、笔记内容生态（Note）"><a href="#五、笔记内容生态（Note）" class="headerlink" title="五、笔记内容生态（Note）"></a>五、笔记内容生态（Note）</h2><h3 id="5-1-笔记详情页（NoteDetailPage）"><a href="#5-1-笔记详情页（NoteDetailPage）" class="headerlink" title="5.1 笔记详情页（NoteDetailPage）"></a>5.1 笔记详情页（NoteDetailPage）</h3><p><strong>两级浏览架构：</strong></p><ul><li><strong>一级预览</strong>：默认进入 <code>startInPreview=true</code>，展示笔记媒体（图片轮播/视频）+ 基本信息；支持左右滑动浏览图片，双击放大。</li><li><strong>二级文本页</strong>：点击「查看全文」进入完整文本页；拦截系统返回与顶部返回，先回一级预览，再返回列表，保证「一级→二级→全屏」与「全屏→二级→一级」的导航链完整。</li><li><strong>媒体播放</strong>：<ul><li>图片使用 <code>CachedNetworkImage</code>，笔记详情轮播图使用缩略图级别 9；</li><li>视频使用 <code>VideoPlayerController</code>，支持点击播放/暂停、双击进入全屏、长按拖动进度条（scrub）；</li><li>首次播放提示「双击可放大播放」，2 秒后自动消失。</li></ul></li><li><strong>背景音乐</strong>：笔记详情增加 <code>musicFileId</code>（取 <code>data.videoFileId</code>），详情页自动播放背景音乐并支持右上角按钮播放/暂停；使用 <code>GlobalMusicService</code> 统一音频焦点管理，视频播放时自动暂停背景音乐，视频结束/离开恢复。</li><li><strong>评论</strong>：底部评论区支持点赞、回复、删除；支持下拉刷新。</li><li><strong>生命周期管理</strong>：页面 <code>dispose</code> 前暂停所有视频，防止返回上一页后视频继续播放；<code>didPushNext</code>/<code>didPopNext</code>/<code>AppLifecycleState</code> 均做媒体暂停/恢复处理。</li></ul><h3 id="5-2-笔记评论系统（NoteCommentSection-NoteCommentController）"><a href="#5-2-笔记评论系统（NoteCommentSection-NoteCommentController）" class="headerlink" title="5.2 笔记评论系统（NoteCommentSection / NoteCommentController）"></a>5.2 笔记评论系统（NoteCommentSection / NoteCommentController）</h3><p><strong>架构设计：</strong></p><ul><li>使用 <code>FamilyAsyncNotifier&lt;NoteCommentState, int&gt;</code>，以 <code>noteId</code> 为 family key，每个笔记的评论数据独立管理。</li><li><strong>评论结构</strong>：支持一级评论与二级回复，嵌套展示；<code>replyShowCount</code> 默认 10，UI 层可对超过 3 条的子评论做折叠处理。</li><li><strong>分页加载</strong>：首次加载 page 1，滚动到底部自动 <code>loadMore()</code>；<code>isLoadingMore</code> 状态控制加载指示器，避免重复请求；到达末尾展示「没有更多评论了」。</li><li><strong>评论操作</strong>：<ul><li><strong>发表评论</strong>：支持一级评论（<code>parentId = 0</code>）与回复指定用户（<code>parentId = commentId</code>, <code>replyToUserId = targetUserId</code>）；发表成功后自动 <code>refresh()</code> 并同步评论数到全局实体仓库（<code>noteInteractionControllerProvider.updateCommentCount</code>）。</li><li><strong>删除评论</strong>：递归遍历评论树找到目标评论并移除（<code>removeFromList</code>），同步更新总数；删除后同步全局仓库。</li><li><strong>点赞/取消点赞（乐观更新）</strong>：先本地翻转 <code>isLiked</code> 与 <code>likeCount</code> 更新 UI，再调用接口；若接口失败则回滚到旧状态，保证用户操作即时反馈且数据一致性。</li></ul></li><li><strong>UI 组件</strong>：<code>NoteCommentItem</code> 展示头像、昵称、内容、时间、点赞数；支持点击回复、点赞、删除（仅自己的评论）。</li><li><strong>空状态</strong>：「暂无评论，快来抢沙发吧」。</li></ul><h3 id="5-3-图片全屏浏览（NoteImageGalleryPage）"><a href="#5-3-图片全屏浏览（NoteImageGalleryPage）" class="headerlink" title="5.3 图片全屏浏览（NoteImageGalleryPage）"></a>5.3 图片全屏浏览（NoteImageGalleryPage）</h3><ul><li>支持多图左右滑动查看，全屏黑色背景，沉浸体验。</li></ul><hr><h2 id="六、音频展览（Audio-Exhibit）"><a href="#六、音频展览（Audio-Exhibit）" class="headerlink" title="六、音频展览（Audio Exhibit）"></a>六、音频展览（Audio Exhibit）</h2><h3 id="6-1-音频展览发布（AudioExhibitPublishPage）"><a href="#6-1-音频展览发布（AudioExhibitPublishPage）" class="headerlink" title="6.1 音频展览发布（AudioExhibitPublishPage）"></a>6.1 音频展览发布（AudioExhibitPublishPage）</h3><ul><li><strong>海报上传区</strong>：虚线边框（<code>DashedBorder</code>）设计，点击上传海报图片；上传后支持替换。</li><li><strong>音视频上传</strong>：支持选择音频或视频文件；视频上传后展示预览，含播放/暂停与进度条。</li><li><strong>富文本表单</strong>：标题、话题标签、简介、脚本；话题支持 <code>#</code> 提取。</li><li><strong>底部发布栏</strong>：固定在底部，「发布」按钮带渐变背景。</li></ul><h3 id="6-2-音频展览播放（AudioExhibitViewPage）"><a href="#6-2-音频展览播放（AudioExhibitViewPage）" class="headerlink" title="6.2 音频展览播放（AudioExhibitViewPage）"></a>6.2 音频展览播放（AudioExhibitViewPage）</h3><ul><li><strong>沉浸式播放器设计</strong>：<ul><li>背景：基于封面图的 <code>BackdropFilter</code> 高斯模糊（<code>sigmaX: 30, sigmaY: 30</code>），营造氛围感；</li><li>中央：圆角封面卡片（<code>ClipRRect</code> + <code>BoxShadow</code>），悬浮于模糊背景之上；</li><li>信息卡：标题、艺术家名、关注按钮；</li><li>底部：播放进度条、播放/暂停按钮、评论与歌单按钮。</li></ul></li><li><strong>状态管理</strong>：使用 <code>GlobalMusicHandle</code> 管理音频播放状态，支持全局暂停/恢复。</li></ul><hr><h2 id="七、个人主页与社交（MyPage-UserProfilePage）"><a href="#七、个人主页与社交（MyPage-UserProfilePage）" class="headerlink" title="七、个人主页与社交（MyPage / UserProfilePage）"></a>七、个人主页与社交（MyPage / UserProfilePage）</h2><h3 id="7-1-个人主页结构"><a href="#7-1-个人主页结构" class="headerlink" title="7.1 个人主页结构"></a>7.1 个人主页结构</h3><ul><li><strong>顶部 Header</strong>：全宽背景图 + <code>BackdropFilter</code> 毛玻璃效果（<code>sigmaX: 30, sigmaY: 30</code>）+ 15% 黑色遮罩；内容区展示头像、昵称、ID、个性签名、关注/粉丝/获赞/收藏数据。</li><li><strong>头像预览</strong>：点击头像进入全屏 <code>PhotoView</code>，支持双指缩放。</li><li><strong>Tab 导航（5 个 Tab）</strong>：笔记、赞过、收藏、展览、生活秀。</li><li><strong>瀑布流展示</strong>：笔记采用 <code>MasonryGridView</code> 双列瀑布流；展览/生活秀采用固定比例网格（<code>177:181</code>）。</li><li><strong>数据懒加载</strong>：Tab 切换时首次加载对应数据，滚动到底部 200px 内自动加载更多。</li><li><strong>刷新机制</strong>：下拉刷新联动当前 Tab 与用户信息；<code>didPopNext</code> 与 <code>AppLifecycleState.resumed</code> 自动刷新用户数据。</li><li><strong>展览封面轮播</strong>：个人主页展览卡片若有多张图，自动 3 秒轮播，带动画过渡（<code>animateToPage</code>, 600ms, <code>easeInOut</code>）。</li><li><strong>社交互动</strong>：支持关注/取消关注、私信入口（聊天功能开发中占位）。</li></ul><h3 id="7-2-编辑资料（HomeEditProfilePage）"><a href="#7-2-编辑资料（HomeEditProfilePage）" class="headerlink" title="7.2 编辑资料（HomeEditProfilePage）"></a>7.2 编辑资料（HomeEditProfilePage）</h3><ul><li>头像上传：点击头像唤起图片选择，支持拍照/相册；右下角悬浮相机图标（白色圆形+阴影）。</li><li>昵称与个性签名输入：表单分组设计，标签 + 圆角输入框（<code>borderRadius: 14</code>）；签名区最小高度 110，多行输入。</li><li>保存按钮：主色背景，带加载态（<code>CircularProgressIndicator</code>）。</li></ul><h3 id="7-3-生活秀（Life-Show）"><a href="#7-3-生活秀（Life-Show）" class="headerlink" title="7.3 生活秀（Life Show）"></a>7.3 生活秀（Life Show）</h3><p><strong>产品定位</strong>：生活秀是展览的一种轻量表达形态，用户可以将日常创作、活动记录以展览形式呈现，降低正式策展的仪式感门槛。</p><p><strong>展示形态：</strong></p><ul><li><strong>列表卡片（LifeShowList）</strong>：纵向列表，每项为圆角 12px 白色卡片，带轻微阴影（<code>0x0A000000</code>）。<ul><li>顶部封面图（高度 180，铺满圆角裁切），加载失败展示灰色占位图标；</li><li>内容区：红色标签（<code>special</code>，如「热门」「精选」）+ 地理位置文案；</li><li>展览名称（单行截断，16px 加粗）；</li><li>推荐描述（两行截断，浅灰色）；</li><li>底部作者行：作者头像（32px 圆形）+ 昵称 + 点赞/评论/收藏统计图标；</li><li>展期信息（<code>startTime - overTime</code>）。</li></ul></li><li><strong>网格卡片（MyLifeShowGrid）</strong>：个人主页「生活秀」Tab 采用双列网格（<code>childAspectRatio: 177/181</code>）。<ul><li>封面图铺满，底部渐变遮罩（<code>#00000000 → #99000000</code>）承载标题与位置；</li><li>右上角红色角标（<code>special</code>）；</li><li>右下角悬浮统计胶囊（半透明黑底圆角 10，点赞/评论数）。</li></ul></li><li><strong>数据模型</strong>：<code>LifeShowItem</code> 包含完整的展览字段（<code>boothList</code>、<code>keywords</code>、<code>author</code>、<code>likeCount</code>、<code>isLiked</code> 等），支持点赞、收藏、评论的完整交互。</li></ul><h3 id="7-4-草稿箱（HomeDraftListPage）"><a href="#7-4-草稿箱（HomeDraftListPage）" class="headerlink" title="7.4 草稿箱（HomeDraftListPage）"></a>7.4 草稿箱（HomeDraftListPage）</h3><p><strong>双 Tab 结构：笔记草稿 + 展览草稿</strong></p><p><strong>笔记草稿：</strong></p><ul><li>使用 <code>_MyNotesGrid</code> 网格展示（与「笔记」Tab 一致），支持点击继续编辑；</li><li>点击后进入 <code>HomeCreateNotePage(editNoteId: noteId)</code>，加载原有标题、正文、媒体、隐私设置；</li><li>编辑返回后自动刷新草稿列表并同步草稿数量。</li><li>分页加载：滚动到底部 180px 内自动加载更多。</li></ul><p><strong>展览草稿：</strong></p><ul><li><strong>懒加载策略</strong>：首次切换到「展览」Tab 时才触发数据拉取，减少首屏开销。</li><li>展示形式：双列网格（<code>177:181</code>），与已发布展览卡片视觉一致。</li><li><strong>继续布展</strong>：点击草稿卡片后：<ol><li>调用 <code>getExhibitionDetail(id)</code> 拉取完整展览详情；</li><li>通过 <code>fastExhibitDraftProvider.notifier.loadFromExhibition(detail)</code> 将草稿数据回填到快布展状态；</li><li>导航至 <code>FastExhibitPage</code>，用户可在原有基础上继续编辑、增删展厅/展位、更换作品；</li><li>返回草稿箱后自动刷新列表。</li></ol></li><li><strong>空状态</strong>：「暂无展览草稿，保存展览草稿后会显示在这里」。</li></ul><hr><h2 id="八、设置与系统"><a href="#八、设置与系统" class="headerlink" title="八、设置与系统"></a>八、设置与系统</h2><h3 id="8-1-设置页（SettingsPage）"><a href="#8-1-设置页（SettingsPage）" class="headerlink" title="8.1 设置页（SettingsPage）"></a>8.1 设置页（SettingsPage）</h3><ul><li><strong>卡片式设置列表</strong>：圆角 12px 白色卡片，分组展示「个人信息」「当前版本」「关于一起展」。</li><li><strong>注销账号</strong>：独立卡片，带警示文案「注销后账号无法恢复，请谨慎操作」。</li><li><strong>退出登录</strong>：底部全宽按钮，点击后清理 Token、上报 Matomo 埋点、跳转登录页并清空路由栈。</li></ul><h3 id="8-2-个人信息页（PersonalInfoPage）"><a href="#8-2-个人信息页（PersonalInfoPage）" class="headerlink" title="8.2 个人信息页（PersonalInfoPage）"></a>8.2 个人信息页（PersonalInfoPage）</h3><ul><li><strong>头像展示区</strong>：114px 大圆形头像，使用 <code>CachedNetworkImage</code> 加载；右下角悬浮相机图标（28px 圆形白底），提示可编辑；点击跳转「编辑资料」页。</li><li><strong>信息列表</strong>：白色卡片圆角 12px，展示「昵称」与「简介」两项，每项带标签（浅灰色 14px）+ 值（深灰色 14px）+ 右侧箭头；未设置时显示「未设置」占位文案。</li><li><strong>跳转逻辑</strong>：点击昵称或简介均跳转 <code>HomeEditProfilePage</code>，用户可在同一页面完成两项编辑。</li></ul><h3 id="8-3-关于页（AboutPage）"><a href="#8-3-关于页（AboutPage）" class="headerlink" title="8.3 关于页（AboutPage）"></a>8.3 关于页（AboutPage）</h3><ul><li><strong>品牌区</strong>：顶部居中展示 App Logo（108px 圆角方形，<code>assets/logo.jpg</code>）+ 应用名称「一起展」（18px 加粗）。</li><li><strong>版本信息</strong>：圆角 12px 白色卡片，展示「当前版本」与「版本更新」；版本更新项带深蓝色标签（<code>#1C2F5D</code>）展示最新版本号，点击提示「已是最新版本」。</li><li><strong>法律合规</strong>：独立白色卡片展示「用户协议」「隐私政策」，点击唤起对应协议页。</li><li><strong>底部版权</strong>：页脚展示「@ 2025-2026 上海艾魅之文化艺术有限公司. All Rights Reserved」+ ICP 备案号「沪ICP备2025146963号-7A」+ 版本号，字体 11px 灰色，体现平台合规性。</li></ul><h3 id="8-4-账号注销页（AccountDeletePage）"><a href="#8-4-账号注销页（AccountDeletePage）" class="headerlink" title="8.4 账号注销页（AccountDeletePage）"></a>8.4 账号注销页（AccountDeletePage）</h3><ul><li>警示性页面，引导用户了解注销后果，确认后执行账号注销流程。</li></ul><hr><h2 id="九、扫码功能（QrScanPage）"><a href="#九、扫码功能（QrScanPage）" class="headerlink" title="九、扫码功能（QrScanPage）"></a>九、扫码功能（QrScanPage）</h2><ul><li>使用 <code>mobile_scanner</code> 实现二维码扫描。</li><li><strong>权限处理</strong>：首次进入检查相机权限，被拒绝时展示「需要摄像头权限」引导页，提供「重试」与「去设置」两个选项。</li><li><strong>扫描界面</strong>：黑色背景，中央挖空矩形框（<code>PathFillType.evenOdd</code> 实现遮罩），白色边框 + 圆角 16；顶部 AppBar 支持手电筒开关与前后摄像头切换。</li><li><strong>结果处理</strong>：扫码结果若是 URL 则尝试外部浏览器打开；否则弹窗展示文本内容；处理完成后自动关闭扫描页。</li></ul><hr><h2 id="十、设计与交互细节汇总"><a href="#十、设计与交互细节汇总" class="headerlink" title="十、设计与交互细节汇总"></a>十、设计与交互细节汇总</h2><h3 id="10-1-视觉一致性"><a href="#10-1-视觉一致性" class="headerlink" title="10.1 视觉一致性"></a>10.1 视觉一致性</h3><ul><li><strong>主题系统</strong>：所有颜色、文字样式、间距均沉淀在 <code>design_system</code> 包的 <code>AppColors</code>、<code>AppTextStyles</code>、<code>AppDimens</code> 中，严禁使用魔法数字。</li><li><strong>渐变运用</strong>：登录按钮紫蓝渐变、发布按钮深蓝渐变、底部栏渐变、展厅信息卡渐变——渐变方向与色值经过精确计算，强化品牌质感。</li><li><strong>圆角体系</strong>：不同场景使用不同圆角半径（小至 2px 的 Chip，大至 24px 的展厅卡，999px 的圆形头像），层次分明。</li></ul><h3 id="10-2-动效与微交互"><a href="#10-2-动效与微交互" class="headerlink" title="10.2 动效与微交互"></a>10.2 动效与微交互</h3><ul><li><strong>点赞动画</strong>：双击视频/作品时红心浮起并淡出。</li><li><strong>标题滚动</strong>：展览页超长标题单向循环滚动，避免截断又不占用额外空间。</li><li><strong>状态切换过渡</strong>：Tab 指示器、Chip 选中态、按钮态均有过渡动画（<code>AnimatedOpacity</code>、<code>AnimatedContainer</code>）。</li><li><strong>图片加载占位</strong>：统一使用 <code>AppImageLoadingPlaceholder</code>，避免布局跳动。</li></ul><h3 id="10-3-性能优化"><a href="#10-3-性能优化" class="headerlink" title="10.3 性能优化"></a>10.3 性能优化</h3><ul><li><strong>图片分级加载</strong>：<code>thumbnailLevel</code> 机制（0=原图/视频，1=大图，2=中图，3=小图，9=笔记轮播缩略图），不同场景按需加载不同尺寸。</li><li><strong>视频预加载</strong>：视频频道提前预热下一条视频控制器。</li><li><strong>Riverpod 状态共享</strong>：点赞、收藏等交互状态通过全局 <code>noteEntityProvider</code> 共享，避免页面间状态不同步。</li><li><strong>RepaintBoundary</strong>：复杂独立图形区域使用 <code>RepaintBoundary</code> 减少不必要的重绘。</li></ul><h3 id="10-4-安全与隐私"><a href="#10-4-安全与隐私" class="headerlink" title="10.4 安全与隐私"></a>10.4 安全与隐私</h3><ul><li><strong>协议前置</strong>：登录、注册必须明确同意用户协议与隐私政策。</li><li><strong>隐私分级</strong>：笔记发布支持「部分可见/不让谁看」的细粒度权限控制，联系人选择支持搜索与多选。</li><li><strong>实名认证</strong>：办展功能需完成实名认证，未认证用户点击办展触发弹窗引导。</li></ul><h3 id="10-5-异常与降级"><a href="#10-5-异常与降级" class="headerlink" title="10.5 异常与降级"></a>10.5 异常与降级</h3><ul><li><strong>视频加载失败</strong>：降级为封面图展示。</li><li><strong>网络证书错误</strong>：登录/验证码场景对 <code>HandshakeException</code> 给出明确中文提示。</li><li><strong>空状态</strong>：所有列表均配备空状态占位（<code>AppEmptyPlaceholder</code>），带图标与引导文案。</li><li><strong>认证过期</strong>：个人主页监听 <code>AuthExpiredException</code>，弹窗引导重新登录，登录成功后自动刷新全部数据。</li></ul><hr><h2 id="十二、全局实体状态管理与跨页面同步"><a href="#十二、全局实体状态管理与跨页面同步" class="headerlink" title="十二、全局实体状态管理与跨页面同步"></a>十二、全局实体状态管理与跨页面同步</h2><p><strong>问题背景</strong>：在传统 Flutter 开发中，跨页面的点赞、收藏、关注状态很容易因各自维护独立状态而失步。用户在一个页面点赞后，回到列表页或进入另一个页面，状态可能回退到旧值。</p><p><strong>「一起展」的解决方案：</strong></p><ul><li><strong>全局实体仓库</strong>：在 <code>shared_models</code> 中定义 <code>noteEntityProvider</code>（<code>StateProvider.family&lt;NoteEntity?, int&gt;</code>）与 <code>exhibitionEntityProvider</code>，以笔记/展览 ID 为 family key，任何页面均可通过同一 Provider 读写同一实体的状态。</li><li><strong>批量同步机制</strong>：<code>batchUpsertNoteEntities(ref, entities)</code> 与 <code>batchUpsertExhibitionEntities(ref, entities)</code> 在列表页收到接口返回后，一次性将所有条目注入全局仓库；详情页、交互控制器则从同一仓库读取最新状态。</li><li><strong>交互控制器架构</strong>：<ul><li><code>noteInteractionControllerProvider</code>：封装点赞/取消点赞逻辑，成功后更新全局 <code>noteEntityProvider</code> 中对应实体的 <code>isLiked</code> 与 <code>likeCount</code>；</li><li><code>exhibitionInteractionControllerProvider</code>：同理处理展览的点赞与收藏。</li></ul></li><li><strong>状态持久化效果</strong>：用户在看展页点赞某作品 → 退出看展页 → 再次进入同一展览，点赞状态保持红色高亮，不会回退到初始值。</li><li><strong>跨页面即时同步</strong>：用户在笔记详情页点赞 → 返回首页瀑布流 → 列表中该笔记的点赞数与红心状态已同步更新（因首页 <code>didPopNext</code> 刷新拉取最新数据，同时全局仓库保证了无刷新时的状态一致性）。</li></ul><hr><h2 id="十三、音频焦点与全局媒体协调"><a href="#十三、音频焦点与全局媒体协调" class="headerlink" title="十三、音频焦点与全局媒体协调"></a>十三、音频焦点与全局媒体协调</h2><p><strong>问题背景</strong>：移动设备同时只能有一个音频焦点。当用户在看展页播放背景音乐，又切换到笔记详情页观看视频，或者进入音频展览页播放语音导览时，必须有一套协调机制防止多个音源互相抢占、混乱播放。</p><p><strong>「一起展」的协调策略：</strong></p><ul><li><strong>GlobalMusicService</strong>：基于 <code>just_audio</code> 封装的全局音乐服务，所有非视频类音频（展厅背景音乐、音频展览）统一由此服务播放。</li><li><strong>MediaPlaybackCoordinator</strong>：视频播放器（<code>video_player</code>）在初始化/播放前向协调器注册；协调器确保同一时刻只有一个视频在播放；新视频开始播放时，自动暂停其他视频与背景音乐。</li><li><strong>音频焦点抢占与恢复</strong>：<ul><li>视频播放 → 自动暂停 <code>GlobalMusicService</code>；</li><li>视频结束/离开视频页 → 若当前页有背景音乐需求，自动恢复播放；</li><li>展厅背景音乐开启 → 视频预加载但不自动播放，等待用户手动点击后才抢占焦点。</li></ul></li><li><strong>展厅内音乐状态精细管理</strong>：<ul><li>进入作品详情页或放大预览 → <code>_pauseMusicTemporarily()</code> 暂停音乐，同时更新 <code>_currentMusicPlaying = false</code>；</li><li>返回展厅 → <code>_resumeMusicTemporarily()</code> 恢复音乐，同时更新 <code>_currentMusicPlaying = true</code>；</li><li>避免因状态缓存过期导致音乐按钮点击无效（<code>_scheduleSyncMusic</code> 中每次校验 <code>_musicHandle.isPlaying</code>，而非依赖过期的本地布尔值）。</li></ul></li><li><strong>Android 音频焦点不中断</strong>：<code>VideoPlayerController</code> 增加 <code>VideoPlayerOptions(mixWithOthers: true)</code>，避免 Android 系统强制抢占音频焦点导致背景乐被系统级中断后无法恢复。</li></ul><hr><h2 id="十四、展览封面解析策略"><a href="#十四、展览封面解析策略" class="headerlink" title="十四、展览封面解析策略"></a>十四、展览封面解析策略</h2><p><strong>封装位置</strong>：<code>lib/features/exhibit/domain/exhibit_cover_resolver.dart</code></p><p><strong>解析规则（体现对多媒体混合场景的细致处理）：</strong></p><ul><li>传入 <code>files</code> 列表（含 <code>fileId</code> + <code>fileType</code>）。</li><li><strong>首项为视频（<code>fileType==2</code>）</strong>：仅使用视频封面（<code>thumbnailLevel=2</code>），不再额外拼接图片，避免视频封面与静态图风格不一致造成视觉跳跃。</li><li><strong>首项为图片（<code>fileType==1</code>）</strong>：提取前 2 张图片（自动跳过视频），用于封面轮播；若不足 2 张则有几张展示几张。</li><li><strong>海报优先</strong>：优先使用 <code>visitFileId</code> 作为海报；若展位首项为图片，则海报 + 首张展位图轮播；若首项为视频，则仅展示海报。</li><li><strong>接入点</strong>：已统一接入 <code>ExhibitRepository</code> 的展览列表、我的展览列表、模板列表组装逻辑，确保全 App 封面展示规则一致。</li></ul><hr><h2 id="十五、一些设计与优化"><a href="#十五、一些设计与优化" class="headerlink" title="十五、一些设计与优化"></a>十五、一些设计与优化</h2><table><thead><tr><th>优化项</th><th>问题</th><th>解决方案</th></tr></thead><tbody><tr><td><strong>状态栏自适应</strong></td><td>从视频/看展页返回首页后，状态栏图标颜色残留，导致在白底上不可见</td><td>首页根节点包裹 <code>AnnotatedRegion&lt;SystemUiOverlayStyle&gt;</code>，视频 Tab 强制 <code>light</code>，其余强制 <code>dark</code></td></tr><tr><td><strong>展厅分组规则</strong></td><td>旧逻辑要求 boothNo 必须完整覆盖 <code>1..boothCount</code>，导致合法但不连续的展位无法渲染</td><td>放宽为：只要存在合法 boothNo 即渲染；fileId 为空的展位占位显示；仅当所有 booth fileId 为空时整厅不渲染</td></tr><tr><td><strong>交互按钮不可点</strong></td><td>自动预览蒙层 <code>Positioned.fill + GestureDetector(opaque)</code> 覆盖了底部点赞/评论/收藏栏</td><td>限制蒙层 <code>bottom: MediaQuery.padding.bottom + 64</code>，仅覆盖内容区，避开底部操作栏</td></tr><tr><td><strong>音乐按钮状态失步</strong></td><td>缓存的 <code>_currentMusicPlaying</code> 布尔值与真实音频播放状态不一致，导致点击无效</td><td>每次同步时以 <code>_musicHandle.isPlaying</code> 为准；临时暂停/恢复时同步更新本地状态</td></tr><tr><td><strong>点赞状态回退</strong></td><td>离开展厅再进入，点赞状态回退到初始值</td><td>全部迁移到 Riverpod 全局实体仓库，以真实 ID 为键持久化交互状态</td></tr><tr><td><strong>视频预加载</strong></td><td>滑动切换视频时频繁出现黑屏/卡顿</td><td>开始播放约 5 秒后预热下一条视频的 <code>VideoPlayerController</code>，优先保证滑动流畅</td></tr><tr><td><strong>动态展位布局</strong></td><td>发布页固定 5 个图位，无法适配不同模板的展位数量差异</td><td>按模板 <code>boothList.length</code> 动态生成展位，提交时也按实际展位数提交 <code>boothList</code></td></tr><tr><td><strong>封面解析一致性</strong></td><td>不同页面展览封面展示规则不一，视频封面与图片混排时视觉混乱</td><td>统一封装 <code>exhibit_cover_resolver</code>，按 <code>fileType</code> 优先级提取，全 App 复用同一策略</td></tr><tr><td><strong>展厅信息卡设计</strong></td><td>策展人姓名蓝色下划线过于花哨，干扰阅读；音乐按钮透明层模糊不清晰</td><td>策展人姓名仅加粗无下划线；音乐按钮改为实底设计，提高可识别度</td></tr><tr><td><strong>发布成功后路由</strong></td><td>发布成功或保存草稿后，用户迷失在布展流程中，不知道回到了哪里</td><td>发布成功 → 首页「我的」Tab；保存草稿 → 草稿箱「展览」Tab，明确告知用户内容归属</td></tr></tbody></table><hr><h2 id="十六、路由体系（AppRoutes-AppRouter）"><a href="#十六、路由体系（AppRoutes-AppRouter）" class="headerlink" title="十六、路由体系（AppRoutes / AppRouter）"></a>十六、路由体系（AppRoutes / AppRouter）</h2><p><strong>架构原则</strong>：壳工程 <code>host_app</code> 集中注册所有路由，各 <code>feature_*</code> 包仅依赖 <code>core_router</code> 的抽象，禁止互相 import 其他 feature 的 Page 类。</p><p><strong>已注册路由清单：</strong></p><table><thead><tr><th>路由名</th><th>页面</th><th>关键参数</th></tr></thead><tbody><tr><td><code>splash</code></td><td><code>SplashPage</code></td><td>—</td></tr><tr><td><code>login</code></td><td><code>LoginPage</code></td><td>—</td></tr><tr><td><code>bindPhone</code></td><td><code>BindPhonePage</code></td><td>—</td></tr><tr><td><code>agreement</code></td><td><code>AgreementPage</code></td><td><code>type</code>（AgreementType）</td></tr><tr><td><code>home</code></td><td><code>HomePage</code></td><td>—</td></tr><tr><td><code>homeCreateNote</code></td><td><code>HomeCreateNotePage</code></td><td>—</td></tr><tr><td><code>homeDrafts</code></td><td><code>HomeDraftListPage</code></td><td><code>initialTabIndex</code>（0=笔记，1=展览）</td></tr><tr><td><code>noteDetail</code></td><td><code>NoteDetailPage</code></td><td><code>noteId</code>, <code>startInPreview</code>, <code>enableBackToPreviewWhenTextMode</code></td></tr><tr><td><code>audioExhibitPublish</code></td><td><code>AudioExhibitPublishPage</code></td><td>—</td></tr><tr><td><code>audioExhibitView</code></td><td><code>AudioExhibitViewPage</code></td><td><code>coverUrl</code>, <code>title</code>, <code>artist</code></td></tr><tr><td><code>fastExhibit</code></td><td><code>FastExhibitPage</code></td><td>—</td></tr><tr><td><code>exhibitTab</code></td><td><code>ExhibitTabPage</code></td><td>—</td></tr><tr><td><code>exhibitCoverTemplate1</code></td><td><code>ExhibitCoverPageTemplate1</code></td><td><code>hall</code>（ExhibitHall）</td></tr><tr><td><code>exhibitDetailTemplate1</code></td><td><code>ExhibitDetailPageTemplate1</code></td><td>—</td></tr><tr><td><code>exhibitDetailType1/2/3</code></td><td>多种展览详情模板</td><td>—</td></tr><tr><td><code>exhibitViewingTemplate1</code></td><td><code>ExhibitViewingPageTemplate1</code></td><td><code>title</code>, <code>exhibitionId</code>, <code>initialDetail</code></td></tr><tr><td><code>exhibitArtworkDetailTemplate1</code></td><td><code>ExhibitArtworkDetailPageTemplate1</code></td><td>作品相关全量参数（<code>imageUrl</code>, <code>visitFileId</code>, <code>artworkAuthor</code> 等）</td></tr><tr><td><code>exhibitArtworkCommentTemplate1</code></td><td><code>ExhibitArtworkCommentPageTemplate1</code></td><td><code>title</code>, <code>commentCount</code>, <code>exhibitionId</code>, <code>boothId</code></td></tr><tr><td><code>exhibition3d</code></td><td><code>Exhibition3dPage</code></td><td>—</td></tr><tr><td><code>userProfile</code></td><td><code>UserProfilePage</code></td><td><code>userId</code></td></tr><tr><td><code>mySettings</code></td><td><code>SettingsPage</code></td><td>—</td></tr><tr><td><code>myPersonalInfo</code></td><td><code>PersonalInfoPage</code></td><td>—</td></tr><tr><td><code>myAbout</code></td><td><code>AboutPage</code></td><td>—</td></tr><tr><td><code>myAccountDelete</code></td><td><code>AccountDeletePage</code></td><td>—</td></tr></tbody></table><p><strong>参数传递规范</strong>：</p><ul><li>所有参数统一通过 <code>Map&lt;String, Object?&gt;</code> 传递；</li><li><code>_args()</code> 辅助函数自动转换参数类型，兼容 <code>Map</code> 与 <code>Map&lt;String, Object?&gt;</code>；</li><li>每个路由构造器负责从 <code>args</code> 中提取字段并赋予默认值，避免空值崩溃。</li></ul><hr><h2 id="十七、设计系统组件（Design-System）"><a href="#十七、设计系统组件（Design-System）" class="headerlink" title="十七、设计系统组件（Design System）"></a>十七、设计系统组件（Design System）</h2><p><code>packages/common/design_system</code> 沉淀了全 App 复用的视觉原子与分子组件，确保跨 feature 体验一致性。</p><h3 id="17-1-主题-Token"><a href="#17-1-主题-Token" class="headerlink" title="17.1 主题 Token"></a>17.1 主题 Token</h3><ul><li><strong>AppColors</strong>：全部颜色常量（<code>textPrimary</code>, <code>textSecondary</code>, <code>textTertiary</code>, <code>buttonPrimary</code>, <code>link</code>, <code>inputBorder</code>, <code>surface</code>, <code>backgroundSecondary</code> 等），无魔法数字。</li><li><strong>AppTextStyles</strong>：按字号/字重/行高分级（<code>loginTitleText28</code>, <code>body12</code>, <code>body14</code>, <code>body16</code>, <code>fastExhibitTitle</code>, <code>button16</code> 等），保证全 App 字体层级统一。</li><li><strong>AppDimens</strong>：间距、圆角、高度等维度常量（<code>pageHorizontalPadding</code>, <code>exhibitBannerHeight</code>, <code>exhibitContentTopOverlap</code>, <code>inputRadius</code> 等）。</li></ul><h3 id="17-2-通用组件"><a href="#17-2-通用组件" class="headerlink" title="17.2 通用组件"></a>17.2 通用组件</h3><ul><li><strong>AppEmptyPlaceholder</strong>：空状态占位，支持自定义标题、副标题、图标；全 App 列表空状态统一使用。</li><li><strong>AppSkeletonHallGrid</strong>：骨架屏网格，用于展览/笔记列表首次加载时的占位，减少白屏焦虑。</li><li><strong>AppImageLoadingPlaceholder</strong>：图片加载中占位，统一灰色背景 + 加载图标，避免布局跳动。</li><li><strong>AppModalSheet</strong>：底部弹窗封装，支持 <code>blurSigma</code> 毛玻璃效果、圆角、自定义内容区；用于作品信息、筛选、分享等场景。</li><li><strong>AppTopToast</strong>：顶部轻提示，用于操作成功/失败的非阻塞反馈（如「已是最新版本」「加载更多失败」）。</li></ul><h3 id="17-3-表单与输入"><a href="#17-3-表单与输入" class="headerlink" title="17.3 表单与输入"></a>17.3 表单与输入</h3><ul><li><strong>DashedBorder</strong>：虚线边框容器，用于海报/封面上传区的「点击上传」视觉引导。</li><li><strong>AppMediaPicker</strong>：统一封装图片/视频/音频选择器，支持拍照、相册、文件选择，供所有 feature 复用。</li></ul><hr><h2 id="十八、埋点与分析（Matomo）"><a href="#十八、埋点与分析（Matomo）" class="headerlink" title="十八、埋点与分析（Matomo）"></a>十八、埋点与分析（Matomo）</h2><p><strong>集成方式</strong>：<code>core_analytics</code> 包封装 Matomo 上报，提供 <code>AppAnalyticsService.instance.trackEvent()</code> 与 <code>trackPageView()</code>。</p><p><strong>埋点覆盖场景：</strong></p><ul><li><strong>页面浏览</strong>：所有路由跳转均携带 <code>matomoTitle</code>（如「首页-推荐」「办展分类」「笔记详情」），用于漏斗分析。</li><li><strong>用户行为</strong>：登录/登出、点赞/取消点赞、收藏、评论、分享、发布笔记/展览、保存草稿。</li><li><strong>视频播放</strong>：视频频道自动上报播放时长、播放错误率、播放完成率。</li><li><strong>布展漏斗</strong>：进入办展分类 → 点击模板 → 开始布展 → 填写信息 → 发布成功，全流程追踪转化率。</li><li><strong>认证过期</strong>：<code>AuthExpiredException</code> 触发时单独上报，用于监控登录态稳定性。</li></ul><p><strong>隐私合规</strong>：</p><ul><li>用户登出时调用 <code>clearVisitorUser()</code>，清除 Matomo 访客标识；</li><li>所有事件 category/action/name 均使用英文枚举，便于国际化团队理解。</li></ul><hr><h2 id="十九、分享系统（AppShareSheet-AppShareService）"><a href="#十九、分享系统（AppShareSheet-AppShareService）" class="headerlink" title="十九、分享系统（AppShareSheet / AppShareService）"></a>十九、分享系统（AppShareSheet / AppShareService）</h2><p><strong>产品定位</strong>：分享是内容社区的核心传播链路，「一起展」为笔记、展览、作品、个人主页均提供了统一的分享能力。</p><p><strong>UI 组件（AppShareSheet）</strong>：</p><ul><li><strong>底部弹窗</strong>：<code>showModalBottomSheet</code> 实现，顶部圆角 16px，毛玻璃背景（<code>BackdropFilter</code>, <code>sigmaX: 16</code>, <code>sigmaY: 16</code>），高度固定 254px；</li><li><strong>标题栏</strong>：左侧「分享」标题（20px 加粗），右侧圆形关闭按钮（28px，浅灰背景 + 深色关闭图标）；</li><li><strong>分享渠道</strong>：横向滑动排列的渠道图标：<ul><li><strong>微信</strong>：54px SVG 图标 + 13px 标签；</li><li><strong>朋友圈</strong>：同上；</li><li><strong>复制链接</strong>：54px 圆形灰底图标 + 链接符号；</li><li>未启用的渠道（私信/微博/QQ 空间）置灰处理（<code>opacity: 0.4</code>），点击提示「该分享渠道暂未开放」。</li></ul></li><li><strong>渠道状态管理</strong>：通过 <code>enabledChannels</code> 参数灵活控制哪些渠道可用，不同场景可差异化配置。</li></ul><p><strong>分享服务（AppShareService）</strong>：</p><ul><li><strong>注册机制</strong>：<code>registerGlobalHandler()</code> 在 App 启动时注入全局分享处理器，实现 feature 包与具体分享 SDK 的解耦；</li><li><strong>微信分享</strong>：基于 <code>wechat_kit</code> 实现，支持分享到微信会话（<code>kSession</code>）和朋友圈（<code>kTimeline</code>）；</li><li><strong>链接复制</strong>：调用 <code>Clipboard.setData</code> 将分享链接复制到剪贴板，成功后提示「链接已复制」；</li></ul><p><strong>分享链接构建（ShareUrlBuilder）</strong>：</p><ul><li><strong>统一域名</strong>：<code>https://app.amaz-cn.com/app/share/</code>，便于 Deeplink 解析与追踪；</li><li><strong>支持类型</strong>：笔记详情、展览观看、作品详情、用户主页；</li><li><strong>参数结构</strong>：<code>?type=xxx&amp;noteId=xxx&amp;exhibitionId=xxx&amp;boothId=xxx&amp;userId=xxx</code>；</li><li><strong>解析能力</strong>：<code>ShareUrlBuilder.parse(Uri)</code> 可反向解析分享链接，用于 Deeplink 跳转（如从微信 H5 唤醒 App 并直达内容页）。</li></ul><p><strong>使用场景</strong>：</p><ul><li>笔记详情页底部栏 → 分享笔记；</li><li>展览浏览页 → 分享展览；</li><li>作品详情页 → 分享单幅作品；</li><li>个人主页 → 分享用户主页。</li></ul><hr><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2026/05/mpe6xxvy.webp" alt></p><blockquote><p>注：本文档基于代码遍历整理，后续可根据实际产品迭代持续补充完善。</p></blockquote>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;本文基于完整开发过程整理，力求还原每一处产品设计与技术实现的细节，供记忆与理念深挖。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2026/05/mpe6x3tg.webp&quot; alt&gt;&lt;/p&gt;
&lt;h2 id=&quot;零、技术理念与产品哲学的映射&quot;&gt;&lt;a href=&quot;#零、技术理念与产品哲学的映射&quot; class=&quot;headerlink&quot; title=&quot;零、技术理念与产品哲学的映射&quot;&gt;&lt;/a&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;/tr&gt;
&lt;/thead&gt;
&lt;tbody&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;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;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;tr&gt;
&lt;td&gt;实名认证前置&lt;/td&gt;
&lt;td&gt;社区治理与内容可信度的基础建设&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;thumbnailLevel 分级加载&lt;/td&gt;
&lt;td&gt;性能与体验的平衡，不因省流量牺牲画质&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
    
    </summary>
    
      <category term="学习笔记" scheme="https://blogs.kainy.cn/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
      <category term="建站❤编程" scheme="https://blogs.kainy.cn/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E5%BB%BA%E7%AB%99%E2%9D%A4%E7%BC%96%E7%A8%8B/"/>
    
    
      <category term="设计" scheme="https://blogs.kainy.cn/tags/%E8%AE%BE%E8%AE%A1/"/>
    
      <category term="产品" scheme="https://blogs.kainy.cn/tags/%E4%BA%A7%E5%93%81/"/>
    
      <category term="一起展" scheme="https://blogs.kainy.cn/tags/%E4%B8%80%E8%B5%B7%E5%B1%95/"/>
    
  </entry>
  
  <entry>
    <title>从“验证码之乱”到自动化路由：一套自研通信SaaS如何盘活全渠道矩阵资产？</title>
    <link href="https://blogs.kainy.cn/2026/04/&#39;%E4%BB%8E%E2%80%9C%E9%AA%8C%E8%AF%81%E7%A0%81%E4%B9%8B%E4%B9%B1%E2%80%9D%E5%88%B0%E8%87%AA%E5%8A%A8%E5%8C%96%E8%B7%AF%E7%94%B1%EF%BC%9A%E4%B8%80%E5%A5%97%E8%87%AA%E7%A0%94%E9%80%9A%E4%BF%A1SaaS%E5%A6%82%E4%BD%95%E7%9B%98%E6%B4%BB%E5%85%A8%E6%B8%A0%E9%81%93%E7%9F%A9%E9%98%B5%E8%B5%84%E4%BA%A7%EF%BC%9F&#39;/"/>
    <id>https://blogs.kainy.cn/2026/04/&#39;从“验证码之乱”到自动化路由：一套自研通信SaaS如何盘活全渠道矩阵资产？&#39;/</id>
    <published>2026-04-27T22:03:13.000Z</published>
    <updated>2026-08-01T09:28:07.936Z</updated>
    
    <content type="html"><![CDATA[<p>全渠道矩阵运营实践中，每个爆品背后都需要无数个鲜活账号的支撑。然而，当公司的账号捆绑在无数手机卡上时，我们失去的不仅是效率，更是对核心数字资产的控制。本文复盘了笔者通过一套自研的内部<a href="https://sms.gqmg.com/landing?blogs=&f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" rel="external nofollow noopener" referrerpolicy="unsafe-url" target="_blank">短信转发管理SaaS系统</a>，彻底终结“找验证码”的噩梦，实现企业数字资产的安全与自治。</p><h3 id="一、-业务狂奔下的“阿喀琉斯之踵”"><a href="#一、-业务狂奔下的“阿喀琉斯之踵”" class="headerlink" title="一、 业务狂奔下的“阿喀琉斯之踵”"></a>一、 业务狂奔下的“阿喀琉斯之踵”</h3><p>笔者供职于一家供应链公司。我们的核心商业模式非常清晰：从供应商商品库中，筛选出兼具市场需求与极致性价比的“潜力爆品”，将其铺货到抖音、拼多多、京东等公域平台进行全网引流；吸引买家成交后，再通过包裹卡、客服引导等方式，将流量沉淀至抖音私域群、微信公众号和小红书矩阵，转化为长期高复购顾客。</p><a id="more"></a><p>这套 <strong>“公域爆破+私域留存”</strong> 的打法，对账号矩阵的依赖度极高。为了承接不同品类的流量，我们需要在各大平台同时挂载几十上百个店铺和私域账号。</p><p>业务发展越快，底层的“基建”愈发成为瓶颈。业务疯张期间，为图方便，公私域部门的员工往往用自己的私人手机号，或者拿着公司零散购买的几部“公用手机”去注册账号。导致及其致命的几个问题：</p><ol><li><strong>效率黑洞（找验证码全靠吼）：</strong> 拼多多运营登录后台，发现验证码发到了新媒体部门的手机上，只好整个办公室喊“谁拿着尾号8848的手机，发一下拼多多的验证码”。每次登录都要耗费十来分钟。</li><li><strong>资产安全与流失风险：</strong> 员工离职时，绑定其私人号码的店铺或公众号交接困难。甚至出现过前员工恶意找回密码、或者因离职注销号码导致公司店铺彻底停转的极端事件。</li><li><strong>合规风控盲区：</strong> 验证码全员可见，毫无隐私与权限可言；更可怕的是，重要业务通知漏看错看，带来的平台惩罚。</li><li><strong>灵活度不足：</strong> 在RPA（机器人自动化流程）等需要通过API获取短信验证码，完成验证的场景，传统的人工接码方式，响应太慢，导致验证超时，从而中断RPA执行，此问题在节假日尤为突出。</li></ol><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2026/04/mnpsxlyg.webp" alt></p><p>作为产品负责人，我意识到：<strong>这不是多买几台手机就能解决的问题，而是典型的“物理资产与数字权限错配”的系统性Bug。</strong></p><h3 id="二、-现实骨感：为什么不能只靠“多办卡”？"><a href="#二、-现实骨感：为什么不能只靠“多办卡”？" class="headerlink" title="二、 现实骨感：为什么不能只靠“多办卡”？"></a>二、 现实骨感：为什么不能只靠“多办卡”？</h3><p>业务部门想到的方案简单粗暴：“给每个运营配一张公司实名卡不就行了？”</p><p>然而经过一轮深入的行业调研，我果断否决了这个方案。在当前的“断卡行动”和严格的实名制监管下，开卡的隐性成本极高：</p><ul><li><strong>个人号限制：</strong> 三大运营商规定，单人名下单运营商最多只能开5张卡。让员工占用个人名额去注册公司业务，员工往往心存顾虑难以推行。</li><li><strong>企业号限制：</strong> 企业开户虽然上限较高，但审核极其繁琐，且依然是“物理卡片”。把几十张企业卡发给几十个员工，一旦卡片丢失或员工私下用于注册违规平台，公司将面临极大的“帮信罪”连带风险。</li></ul><p><strong>调研最终结论是：底层逻辑不是把“手机卡”发给员工，而是把手机卡里的“信息（验证码）”精准、安全地分发给业务负责人。</strong> 硬件必须集中管控，权限则通过软件解耦。</p><p>基于此结论，由我牵头开始了 <strong>“企业级通信资产路由中枢”</strong> 方案的实施。</p><h3 id="三、-系统架构设计：物理集中，权限解耦"><a href="#三、-系统架构设计：物理集中，权限解耦" class="headerlink" title="三、 系统架构设计：物理集中，权限解耦"></a>三、 系统架构设计：物理集中，权限解耦</h3><p>最终方案的落脚点，不止是一个简单的“短信转发器”，而是一个真正的 SaaS 级业务调度系统。整套系统分为“硬件托管层”与“云端路由层”。</p><h4 id="1-硬件层：消灭物理手机"><a href="#1-硬件层：消灭物理手机" class="headerlink" title="1. 硬件层：消灭物理手机"></a>1. 硬件层：消灭物理手机</h4><p>我们采购了成本极低的 4G 工业通信网关（DTU设备），将公司所有申请的实名制手机卡集中插入这些仅有巴掌大小的盒子里，统一放置在公司的弱电机房。这些设备只有接收功能，从而杜绝了被挪用外呼或发送垃圾短信的合规风险。</p><h4 id="2-云端路由层：基于正则的“分发引擎”"><a href="#2-云端路由层：基于正则的“分发引擎”" class="headerlink" title="2. 云端路由层：基于正则的“分发引擎”"></a>2. 云端路由层：基于正则的“分发引擎”</h4><p>这是整套 SaaS 的灵魂所在。我们将短信盒接收到的短信汇聚到云端控制台，并设计了一套强大的 <strong>“智能路由规则”</strong> 。</p><ul><li><strong>精准解析：</strong> 系统通过正则表达式（Regex）自动剔除营销废话，精准提取 4-6 位验证码。</li><li><strong>基于特征的分发：</strong> 运营主管可以极低门槛地配置规则。例如：<ul><li><strong>规则 A：</strong> 短信抬头为关键字 <code>【拼多多】</code> 或 <code>【抖店】</code> ➡️ 自动推送到钉钉/飞书的“电商运营组”群聊。</li><li><strong>规则 B：</strong> 短信包含 <code>【微信公众平台】</code> ➡️ 推送给私域部门负责人A的私聊。</li><li><strong>规则 C（兜底）：</strong> 未命中的其他信息 ➡️ 推送给 IT 运维组，监控是否有异常注册。</li></ul></li></ul><h4 id="3-闭环管理：权限收放自如"><a href="#3-闭环管理：权限收放自如" class="headerlink" title="3. 闭环管理：权限收放自如"></a>3. 闭环管理：权限收放自如</h4><p>当新员工入职，主管只需在系统中将对应的通道权限赋予他的飞书账号；当员工离职，一键取消通道绑定，该员工瞬间失去所有验证码接收权限，带不走任何数字资产。</p><p>灵活的转发规则配置，叠加精细化权限管理，让号码得以在不同平台和部门间，分层次复用。原先，想要让电商运营部门和内容运营共享号码，实操难度极大。而现在通过精准转发，同一个号码用在不同领域，然后根据关键字路由到所需人员。原本需要30个号码支撑的小项目，现在不到10个号码就能满足需求。</p><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2026/04/mnptijm0.webp" alt></p><h3 id="四、-价值验证：从成本中心到效率引擎"><a href="#四、-价值验证：从成本中心到效率引擎" class="headerlink" title="四、 价值验证：从成本中心到效率引擎"></a>四、 价值验证：从成本中心到效率引擎</h3><p>目前这套 SaaS 系统已稳定运行半年有余，我们进行了一次严密的数据复盘，发现收益远超预期：</p><ol><li><strong>效率飞跃：</strong> 登录验证的平均耗时从过去的 <strong>2-5分钟</strong> 缩短至毫秒级推送。系统实测从硬件接收到飞书群弹出验证码，端到端延迟仅为 <strong>1.5秒</strong>。运营团队彻底告别了“找手机”的内耗。</li><li><strong>资产绝对安全：</strong> 在过去半年的人员流动中，因号码问题导致的公司账号流失率降为 <strong>0%</strong>。所有注册和登录行为留存日志，可随时溯源审计。</li><li><strong>硬件与管理成本锐减：</strong> 淘汰了原本为了收短信而采购的几十台旧智能手机，硬件投入成本下降了 <strong>85%</strong>，同时消灭了给旧手机充电、连 WiFi 的维护噩梦。</li></ol><h3 id="五、-未来演进：当“通信路由”长出-AI-大脑"><a href="#五、-未来演进：当“通信路由”长出-AI-大脑" class="headerlink" title="五、 未来演进：当“通信路由”长出 AI 大脑"></a>五、 未来演进：当“通信路由”长出 AI 大脑</h3><p>完成文本短信的分发，只是我们重构企业通信基建的第一步。随着各大平台的风控升级，以及业务场景的复杂化，我们已经在推进系统的 2.0 升级，核心聚焦于 <strong>“语音流的解析”</strong> 与 <strong>“大模型的业务决策”</strong>：</p><p><strong>1. 攻克风控高地：TTS 动态交互与语音验证码转录</strong><br>在特殊高频操作或异地登录场景下，平台会强制使用“语音验证码”；同时，部分供应商或客户可能会直接拨打我们绑定在各大平台的预留手机号。传统的短信转发器在面对“来电”时形同废铁。</p><p>为此，我们计划在硬件底层打通语音通道：</p><ul><li><strong>TTS（文本转语音）智能应答：</strong> 业务人员可以在后台动态设置接听文案。当有来电时，系统会自动接痛并 TTS 播报（如：“您好，这里是XX供应链电商部，暂不方便接听，请您留言或添加微信…”），极大提升了对外展现的专业度。</li><li><strong>语音验证码自动转文字 (STT)：</strong> 系统可录制来电声音，利用语音识别技术，提取出语音中的验证码数字，并像普通短信一样路由推送到对应的飞书群。彻底消灭“语音漏接”的业务死角。</li></ul><p><strong>2. 告别硬编码：引入大模型（LLM）实现语义级路由</strong><br>目前的转发规则实现，依赖于提前设置好的正则表达式（Regex）匹配。这虽然高效，但维护成本较高（平台稍微改动短信文案模板，正则就可能失效）。<br>在接下来的版本中，我们计划接入轻量级的 LLM 进行“意图识别”：</p><ul><li><strong>智能提取与脱敏：</strong> 让 AI 去阅读短信，自动分辨哪些是验证码、哪些是快递取件码、哪些是平台违规警告。系统只提取核心信息，自动隐藏或抹除无关的营销废话。</li><li><strong>情绪感知与紧急调度：</strong> 如接收到类似“您的店铺存在严重违规，即将扣除保证金”或消费者发送的“我要投诉”等短信，AI 能够敏锐感知其紧急程度，无视原有的常规路由规则，直接触发电话或强震动提醒业务负责人，将其升级为“高优先级工单”。</li></ul><p>从“物理设备的解耦”，到“文本规则的路由”，再到未来“AI驱动的智能通信中枢”，这套系统正在为业务全渠道狂奔，提供最坚实保障。</p><h3 id="六、-写在最后"><a href="#六、-写在最后" class="headerlink" title="六、 写在最后"></a>六、 写在最后</h3><p>这套方案的成功，让我深刻体会到：产品经理的价值不仅在于设计 C 端的增长裂变，更在于深入企业的毛细血管，用数字化手段解决最底层的生产力损耗。</p><p><strong>有意思的是，这个原本为了自救而研发的系统，最近在接待同行和上下游供应商参观时，意外引起了极大关注。</strong> 很多多平台卖家和 MCN 机构的老板日常都遇到过类似的“管理痛点”，甚至强烈要求我们把这套系统开放给他们付费使用。</p><p>这也引发了我的商业思考：企业服务市场的许多好产品，往往就孵化于在日常业务的痛点。基于此契机，我们团队正在评估将这套内部 SaaS 进行商业化剥离，推出面向外部团队的 SaaS 订阅版（包含硬件节点部署与多端推送）。</p><p><strong>如果你所在的团队也正被“满桌子手机、满天飞的验证码、离职交接难”等问题折磨，欢迎在评论区或后台私信交流，或许我们可以帮你用几天时间，<a href="https://sms.gqmg.com/landing?blogs2=&f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" rel="external nofollow noopener" referrerpolicy="unsafe-url" target="_blank">彻底重构团队的数字通信底座</a>。</strong></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;全渠道矩阵运营实践中，每个爆品背后都需要无数个鲜活账号的支撑。然而，当公司的账号捆绑在无数手机卡上时，我们失去的不仅是效率，更是对核心数字资产的控制。本文复盘了笔者通过一套自研的内部&lt;a href=&quot;https://sms.gqmg.com/landing?blogs=&amp;f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE&quot; rel=&quot;external nofollow noopener&quot; referrerpolicy=&quot;unsafe-url&quot; target=&quot;_blank&quot;&gt;短信转发管理SaaS系统&lt;/a&gt;，彻底终结“找验证码”的噩梦，实现企业数字资产的安全与自治。&lt;/p&gt;
&lt;h3 id=&quot;一、-业务狂奔下的“阿喀琉斯之踵”&quot;&gt;&lt;a href=&quot;#一、-业务狂奔下的“阿喀琉斯之踵”&quot; class=&quot;headerlink&quot; title=&quot;一、 业务狂奔下的“阿喀琉斯之踵”&quot;&gt;&lt;/a&gt;一、 业务狂奔下的“阿喀琉斯之踵”&lt;/h3&gt;&lt;p&gt;笔者供职于一家供应链公司。我们的核心商业模式非常清晰：从供应商商品库中，筛选出兼具市场需求与极致性价比的“潜力爆品”，将其铺货到抖音、拼多多、京东等公域平台进行全网引流；吸引买家成交后，再通过包裹卡、客服引导等方式，将流量沉淀至抖音私域群、微信公众号和小红书矩阵，转化为长期高复购顾客。&lt;/p&gt;
    
    </summary>
    
      <category term="学习笔记" scheme="https://blogs.kainy.cn/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
      <category term="建站❤编程" scheme="https://blogs.kainy.cn/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E5%BB%BA%E7%AB%99%E2%9D%A4%E7%BC%96%E7%A8%8B/"/>
    
    
      <category term="自动化" scheme="https://blogs.kainy.cn/tags/%E8%87%AA%E5%8A%A8%E5%8C%96/"/>
    
      <category term="验证码" scheme="https://blogs.kainy.cn/tags/%E9%AA%8C%E8%AF%81%E7%A0%81/"/>
    
  </entry>
  
  <entry>
    <title>“不说错，也不全说”：跨部门协作中的智慧与痼疾</title>
    <link href="https://blogs.kainy.cn/2026/04/&#39;%E2%80%9C%E4%B8%8D%E8%AF%B4%E9%94%99%EF%BC%8C%E4%B9%9F%E4%B8%8D%E5%85%A8%E8%AF%B4%E2%80%9D%EF%BC%9A%E8%B7%A8%E9%83%A8%E9%97%A8%E5%8D%8F%E4%BD%9C%E4%B8%AD%E7%9A%84%E6%99%BA%E6%85%A7%E4%B8%8E%E7%97%BC%E7%96%BE&#39;/"/>
    <id>https://blogs.kainy.cn/2026/04/&#39;“不说错，也不全说”：跨部门协作中的智慧与痼疾&#39;/</id>
    <published>2026-04-26T21:03:13.000Z</published>
    <updated>2026-08-01T09:28:07.936Z</updated>
    
    <content type="html"><![CDATA[<p>在职业场域中的沟通以及跨部门间的协作进程里，我们常会遇到这样一种微妙情况，即“所说并非全错，但也并非全部说出”</p><p>这句话精准地概括了职场信息传递中的灰色地带。面对这种现象，我们不禁要问：这究竟是管理者过滤信息的智慧，还是团队协作中推诿扯皮的痼疾？</p><p>答案并非非黑即白。<strong>这把“信息过滤的剪刀”掌握在谁手里，以及为了什么目的而剪，决定了它的性质。</strong> </p><h3 id="一、-什么时候它是“管理智慧”？"><a href="#一、-什么时候它是“管理智慧”？" class="headerlink" title="一、 什么时候它是“管理智慧”？"></a>一、 什么时候它是“管理智慧”？</h3><p>在纷繁复杂的业务运作进程中，将所有信息和盘托出往往既不切实际，甚至还会产生不良影响。在特定情境中，有针对性地传递信息，其目的在于优化效率以及保护团队。</p><a id="more"></a><ul><li><p>在向上汇报时的“信息降噪”场景，决策层所需的是包含结论，风险，成本以及可行性方案在内的相关内容。若在汇报时事无巨细地将底层架构重构中的每一个代码坑一一列举出来，反倒会产生信息噪音。此时有所保留，是为了将重点置于核心商业价值之上。</p></li><li><p>对于危机处理中的“情绪管理”：当线上系统遭遇严重故障或项目处于极度高压状态时，若身为团队核心的你将所有未知风险及高层施压毫无保留地传递给一线执行人员，极有可能导致团队动作出现偏差。这时进行的过滤操作，目的在于稳定军心并确保执行力能得到有效保障。</p></li><li><p>在为获取资源或与外部供应商进行技术选型操作（如POC测试等情况）的过程中，保持一定程度的“边界感”以保留部分底牌，这是一种合理的防御性策略。</p></li></ul><h3 id="二、-什么时候它是“协作痼疾”？"><a href="#二、-什么时候它是“协作痼疾”？" class="headerlink" title="二、 什么时候它是“协作痼疾”？"></a>二、 什么时候它是“协作痼疾”？</h3><p>当“不全说”的动机从“推动业务”转变为“规避个人责任”时，它就演变成协作中最为致命的毒药，即防御性沟通。</p><p>在日常协作中，这种痼疾往往表现为令人高血压的“半拉子工程”：<br>场景A：需要让财务去开通授信账户。财务在系统内创建账户后，向你告知“账户已经开设妥当”当你需要调用时，才发现额度已经归零，完全无法使用。<br>场景B：咨询某一款商品能否进行上架运营的相关事宜。运营方作出回复表示“商品的图片已经完成更换”前端研发人员在默认所有准备工作均已完成的情况下点击进行上架与推流操作，但是随后发现系统未对库存及物流模板进行配置，最终导致线上无法开展发货业务。</p><p>表面上看，财务和运营都没有“说错”，他们完成了自己视角的任务。但这背后暴露了三个致命的团队沟通问题：</p><ol><li><strong>本位主义（动作导向 vs 目标导向）：</strong> 只对“自己手头的动作”负责，对下游的“最终业务目标”缺乏认知或漠不关心。</li><li><strong>上下文断层（Context 缺失）：</strong> 沟通双方都在用自己的“隐性假设”填补信息空白，缺乏对齐。</li><li><strong>缺乏完成定义（Definition of Done）：</strong> 整个流水线对“什么叫准备好了”没有达成流程上的共识。</li></ol><h3 id="三、-破局之道：如何打破信息壁垒？"><a href="#三、-破局之道：如何打破信息壁垒？" class="headerlink" title="三、 破局之道：如何打破信息壁垒？"></a>三、 破局之道：如何打破信息壁垒？</h3><p>无论是作为信息的接收方（需求方）还是提供方，我们都需要一套机制来对抗这种沟通中的人性弱点。</p><h4 id="作为需求方：建立“防御性协同”机制"><a href="#作为需求方：建立“防御性协同”机制" class="headerlink" title="作为需求方：建立“防御性协同”机制"></a>作为需求方：建立“防御性协同”机制</h4><ol><li><strong>沟通升级，抛出“场景化需求”：</strong> 不要只下达单点指令。将“麻烦开个账户”升级为“我们需要一笔X万的采买，请开通账户并确保额度足够”。用目标打破对方的动作导向。</li><li><strong>强制“闭环确认”（反向翻译）：</strong> 当收到模棱两可的回复（如“图换好了”）时，主动将信息翻译成业务结果并要求对方确认：“确认目前库存和物流已就绪，我现在点击上架并全量推流，不会有发货问题对吧？”通过追问划清责任边界。</li><li><strong>用系统底座代替人工承诺：</strong> 在技术架构和平台化管理中，最可靠的防御是系统拦截。例如，前端发布系统在执行上架前，强制校验库存接口和物流状态；状态异常则直接拦截并阻断。</li></ol><h4 id="作为提供方：推行“白盒化交付”"><a href="#作为提供方：推行“白盒化交付”" class="headerlink" title="作为提供方：推行“白盒化交付”"></a>作为提供方：推行“白盒化交付”</h4><p>为了避免被误解为“留一手”或制造信息特权，技术骨干和管理者需要主动从“被动分发者”转变为“上下文构建者”。</p><ol><li><strong>践行“+1 步原则”：</strong> 回答问题时主动暴露关联影响。例如，“服务已重启，但接下来10分钟内缓存会重建，数据库可能有短期压力，请知悉。”</li><li><strong>推动隐性知识的“白盒化”：</strong> 消除技术特权猜忌的最好方法是将黑盒变白盒。一方面，将复杂的配置和排障过程沉淀为知识库文档；另一方面，推动完善的系统监控（例如引入专业的 APM 监控系统），将核心链路的状态、性能看板直接共享给业务和相关团队。让数据自己说话，变被动解答为主动透明。</li><li><strong>Checklist 交付习惯：</strong> 交付结果时附带颗粒度清晰的检查项。例如，“功能已发版。我已确认：1. 核心链路畅通；2. 日志无异常报错。你们可以开始配置了。”</li><li><strong>坦诚未知与边界：</strong> 如果某些技术方案的 POC 尚未跑完，直接承认“目前高并发压测数据还在验证，暂时不能承诺完全无风险”，远比含糊其辞更能赢得信任。</li></ol><h3 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h3><p>“不说错，也不全说”的背后，本质上是组织信任度与流程成熟度的综合反映。优秀的协作不在于你说了多少句话，而在于你是否展现出了 <strong>“我愿意与你共享全局上下文，并为共同目标负责”</strong> 的专业姿态。用流程对抗人性，用系统保障下限，用透明建立信任，才是打破沟通壁垒的根本解法。</p>]]></content>
    
    <summary type="html">
    
      &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;h3 id=&quot;一、-什么时候它是“管理智慧”？&quot;&gt;&lt;a href=&quot;#一、-什么时候它是“管理智慧”？&quot; class=&quot;headerlink&quot; title=&quot;一、 什么时候它是“管理智慧”？&quot;&gt;&lt;/a&gt;一、 什么时候它是“管理智慧”？&lt;/h3&gt;&lt;p&gt;在纷繁复杂的业务运作进程中，将所有信息和盘托出往往既不切实际，甚至还会产生不良影响。在特定情境中，有针对性地传递信息，其目的在于优化效率以及保护团队。&lt;/p&gt;
    
    </summary>
    
      <category term="东写西读" scheme="https://blogs.kainy.cn/categories/%E4%B8%9C%E5%86%99%E8%A5%BF%E8%AF%BB/"/>
    
      <category term="心路历程" scheme="https://blogs.kainy.cn/categories/%E4%B8%9C%E5%86%99%E8%A5%BF%E8%AF%BB/%E5%BF%83%E8%B7%AF%E5%8E%86%E7%A8%8B/"/>
    
    
      <category term="沟通" scheme="https://blogs.kainy.cn/tags/%E6%B2%9F%E9%80%9A/"/>
    
      <category term="职场" scheme="https://blogs.kainy.cn/tags/%E8%81%8C%E5%9C%BA/"/>
    
  </entry>
  
  <entry>
    <title>从单体走向 Monorepo：一起展App 基于 Melos 的 Flutter 模块化架构重构实践</title>
    <link href="https://blogs.kainy.cn/2026/04/%E4%BB%8E%E5%8D%95%E4%BD%93%E8%B5%B0%E5%90%91%20Monorepo%EF%BC%9A%E4%B8%80%E8%B5%B7%E5%B1%95App%20%E5%9F%BA%E4%BA%8E%20Melos%20%E7%9A%84%20Flutter%20%E6%A8%A1%E5%9D%97%E5%8C%96%E6%9E%B6%E6%9E%84%E9%87%8D%E6%9E%84%E5%AE%9E%E8%B7%B5/"/>
    <id>https://blogs.kainy.cn/2026/04/从单体走向 Monorepo：一起展App 基于 Melos 的 Flutter 模块化架构重构实践/</id>
    <published>2026-04-24T21:03:13.000Z</published>
    <updated>2026-08-01T09:28:07.946Z</updated>
    
    <content type="html"><![CDATA[<h2 id="1-背景与痛点-Situation-amp-Task"><a href="#1-背景与痛点-Situation-amp-Task" class="headerlink" title="1. 背景与痛点 (Situation &amp; Task)"></a>1. 背景与痛点 (Situation &amp; Task)</h2><p>在项目（Zhanzhan）初期，为了追求业务的快速迭代，我们采用了传统的 Flutter 单体工程（Monolith）架构。所有的业务逻辑、网络请求、UI 组件和路由都高度集中在同一个 <code>lib</code> 目录下。</p><p>随着业务场景的不断丰富（涵盖了“办展”、“看展笔记”、“信息流”、“个人中心”等多个核心域），单体架构的弊端开始集中爆发，主要体现在：</p><ul><li><p><strong>代码边界模糊，陷入“面条代码”：</strong> 业务模块之间直接互相 <code>import</code> 页面类，导致严重的隐式耦合。改动“商城”模块的代码，可能会意外引发“看展”模块的崩溃。</p></li><li><p><strong>依赖冲突频发，包管理失控：</strong> 全局共用一个 <code>pubspec.yaml</code>，第三方依赖版本牵一发而动全身，极大地限制了不同业务线的技术选型自由度。</p></li><li><p><strong>编译与代码生成效率低下：</strong> 在单体架构下，运行一次 <code>build_runner</code> 生成代码需要遍历全局，耗时极长，严重影响研发心智和效率。</p></li></ul><p>为了支撑中大型团队的协同开发，抹平不同业务模块的进度差，我们决定彻底打破单体架构，全面向 <strong>基于 Melos 的 Monorepo（单体仓库多包管理）架构</strong> 演进。    </p><a id="more"></a><h2 id="2-核心架构设计：严谨的“四层洋葱模型”-Action-Architecture"><a href="#2-核心架构设计：严谨的“四层洋葱模型”-Action-Architecture" class="headerlink" title="2. 核心架构设计：严谨的“四层洋葱模型” (Action - Architecture)"></a>2. 核心架构设计：严谨的“四层洋葱模型” (Action - Architecture)</h2><p>重构的核心不在于拆分物理文件夹，而在于<strong>建立清晰的依赖单向传递规则</strong>。我们彻底摒弃了按业务粗粒度划分的思路，而是结合业务现状，采用“细粒度拆分 + 严格分层”的设计，将系统划分为四个独立的生命周期层：</p><h3 id="2-1-壳工程层-Host-App-apps-host-app"><a href="#2-1-壳工程层-Host-App-apps-host-app" class="headerlink" title="2.1 壳工程层 (Host App: apps/host_app)"></a>2.1 壳工程层 (Host App: <code>apps/host_app</code>)</h3><ul><li><p><strong>定位：</strong> 整个 App 的组装流水线。</p></li><li><p><strong>职责：</strong> 自身几乎不包含具体的业务逻辑代码（除了 <code>splash</code> 启动页等强入口逻辑）。它负责引入底层和业务侧的各个 package，完成全局路由表 (<code>app_routes.dart</code>) 的注册、状态管理 (<code>ProviderScope</code>) 的初始化，以及全局依赖注入。</p></li></ul><h3 id="2-2-基础能力层-Core-packages-core"><a href="#2-2-基础能力层-Core-packages-core" class="headerlink" title="2.2 基础能力层 (Core: packages/core)"></a>2.2 基础能力层 (Core: <code>packages/core</code>)</h3><ul><li><p><strong>定位：</strong> 极度稳定、与业务毫无关联的底层基建。</p></li><li><p><strong>模块：</strong></p><ul><li><p><code>core_network</code>: 基于 Dio 的网络封装、拦截器体系与 Mock 机制。</p></li><li><p><code>core_router</code>: 基于 GoRouter 的全局路由抽象。</p></li><li><p><code>core_storage</code>: 本地持久化（Token 管理）。</p></li><li><p><code>core_analytics</code>: 全局埋点服务。</p></li></ul></li></ul><h3 id="2-3-公共复用层-Common-packages-common"><a href="#2-3-公共复用层-Common-packages-common" class="headerlink" title="2.3 公共复用层 (Common: packages/common)"></a>2.3 公共复用层 (Common: <code>packages/common</code>)</h3><ul><li><p><strong>定位：</strong> 跨业务模块复用的中间件与共享领域。</p></li><li><p><strong>模块：</strong></p><ul><li><p><code>auth_session</code>: 用户鉴权守卫与当前用户信息。</p></li><li><p><code>design_system</code>: 统一的设计语言（UI 组件、颜色、字体）。</p></li><li><p><code>shared_models</code>: 跨模块的高频实体（如 ExhibitRepository，保证数据一致性）。</p></li></ul></li></ul><h3 id="2-4-业务功能层-Features-packages-features"><a href="#2-4-业务功能层-Features-packages-features" class="headerlink" title="2.4 业务功能层 (Features: packages/features)"></a>2.4 业务功能层 (Features: <code>packages/features</code>)</h3><ul><li><p><strong>定位：</strong> 并行迭代的业务线，高度内聚。</p></li><li><p><strong>模块：</strong> <code>feature_auth</code> (登录)、<code>feature_home</code> (首页)、<code>feature_exhibit</code> (办展)、<code>feature_note</code> (笔记)。</p></li><li><p><strong>铁律：</strong> 各 feature 包之间<strong>绝对物理隔离，禁止相互依赖</strong>。跨业务通信统一上浮至壳工程的路由中心或通过协议解耦。</p></li></ul><h2 id="3-关键技术决策-Action-Key-Decisions"><a href="#3-关键技术决策-Action-Key-Decisions" class="headerlink" title="3. 关键技术决策 (Action - Key Decisions)"></a>3. 关键技术决策 (Action - Key Decisions)</h2><p>在此次重构落地过程中，我们做出了几个对后续研发规范具有决定性意义的技术决策：</p><h3 id="决策一：采用微模块（Micro-feature）而非宏观领域驱动"><a href="#决策一：采用微模块（Micro-feature）而非宏观领域驱动" class="headerlink" title="决策一：采用微模块（Micro-feature）而非宏观领域驱动"></a>决策一：采用微模块（Micro-feature）而非宏观领域驱动</h3><p>在模块划分初期，我们曾面临是建立宏观的“商城”和“看展”大包，还是按实际功能拆分的抉择。考虑到团队规模和业务敏捷度，我们最终选择了以现状为准的<strong>细粒度拆分</strong>。</p><p>我们没有预先建立空壳的“业务大组”，而是将 <code>exhibit</code>、<code>note</code> 等功能抽离为独立的 feature。同时，将 <code>auth</code> 这种具有跨域性质的模块下沉，将 <code>splash</code> 等应用生命周期强相关的代码保留在壳工程。这种实事求是的拆解，避免了过度设计，也使得架构不会头重脚轻。</p><h3 id="决策二：确立严苛的-Import-路径规范"><a href="#决策二：确立严苛的-Import-路径规范" class="headerlink" title="决策二：确立严苛的 Import 路径规范"></a>决策二：确立严苛的 Import 路径规范</h3><p>为了防止 Monorepo 再次退化为单体，我们在代码静态检查中贯彻了基于物理隔离的引用原则：</p><ul><li><p><strong>包内高内聚（自闭环）：</strong> 同一个 package 内部（例如 <code>feature_auth</code> 内部）互相调用，强制使用相对路径 <code>../</code>。这保证了模块的完全可移植性。</p></li><li><p><strong>包间低耦合（物理边界）：</strong> 跨越 package 借用能力时，严禁使用 <code>../</code>。必须在 <code>pubspec.yaml</code> 中声明依赖后，使用 <code>package:</code> 绝对路径引入。这为代码审查（Code Review）提供了最直观的边界预警。</p></li></ul><h3 id="决策三：Riverpod-状态与路由的分布式管理"><a href="#决策三：Riverpod-状态与路由的分布式管理" class="headerlink" title="决策三：Riverpod 状态与路由的分布式管理"></a>决策三：Riverpod 状态与路由的分布式管理</h3><p>得益于架构分层，我们对状态管理也进行了重组。底层的网络和存储服务在 <code>core</code> 中以 Provider 提供；业务数据层（如 <code>homeNoteRepository</code>）集中在 <code>shared_models</code> 中以便跨域调用；而页面 UI 的状态（如 <code>LoginController</code>, <code>HomeFeedController</code>）则通过 <code>@riverpod</code> 局部封闭在各自的 feature 包内。配合 Melos 的并行脚本，极大地提升了代码生成的效率。</p><h2 id="4-落地收益与未来展望-Result"><a href="#4-落地收益与未来展望-Result" class="headerlink" title="4. 落地收益与未来展望 (Result)"></a>4. 落地收益与未来展望 (Result)</h2><p>经过数周的奋战，Zhanzhan 项目已全面平稳过渡到 Monorepo 架构。带来的直接收益包括：</p><ol><li><p><strong>研发效能跃升：</strong> 开发“办展”模块的同学只需关注 <code>feature_exhibit</code>，无需关心“笔记”模块的代码变更。同时 <code>melos run build</code> 的并行代码生成，将原本漫长的等待时间缩短了 70% 以上。</p></li><li><p><strong>强制的防腐层建设：</strong> feature 之间的硬隔离，彻底杜绝了业务间的循环依赖，使代码架构符合开闭原则（OCP）。</p></li><li><p><strong>技术栈解绑：</strong> 独立的 <code>pubspec.yaml</code> 使得各个模块在未来可以独立升级依赖库，甚至在核心能力层进行灰度技术替换而不影响上层业务。</p></li></ol><p><strong>展望：</strong></p><p>随着这套基础设施的落成，我们下一步的重心将转向<strong>模块的独立编译与调试</strong>。依托 Melos 的能力，我们将为每个核心 Feature 构建独立的 example 工程，使得研发人员在不运行完整壳工程的情况下，也能快速启动并调试单一模块，真正实现从“能跑”向“跑得快”的敏捷研发转型。</p><hr><blockquote><p>项目：<code>zhanzhan</code>（Flutter + Riverpod + Dio · Melos Monorepo）</p></blockquote><h2 id="1-根目录概览"><a href="#1-根目录概览" class="headerlink" title="1. 根目录概览"></a>1. 根目录概览</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line">zhanzhan/</span><br><span class="line">├── apps/</span><br><span class="line">│   └── host_app/              # 壳工程（主入口、路由、平台工程）</span><br><span class="line">├── packages/</span><br><span class="line">│   ├── core/                  # 基础能力层</span><br><span class="line">│   │   ├── core_network/      # 网络层（Dio + 拦截器 + Mock）</span><br><span class="line">│   │   ├── core_storage/      # 本地存储（Token 持久化）</span><br><span class="line">│   │   ├── core_router/       # 路由抽象（GoRouter 封装）</span><br><span class="line">│   │   └── core_analytics/    # 埋点（Matomo）</span><br><span class="line">│   ├── common/                # 公共复用层</span><br><span class="line">│   │   ├── auth_session/      # 鉴权会话（登录失效守卫 + 用户信息）</span><br><span class="line">│   │   ├── design_system/     # 设计系统（主题 / 通用组件）</span><br><span class="line">│   │   └── shared_models/     # 共享模型（跨模块数据 + Repository）</span><br><span class="line">│   └── features/              # 业务功能模块</span><br><span class="line">│       ├── feature_auth/      # 登录 / 注册 / 协议</span><br><span class="line">│       ├── feature_home/      # 首页（信息流 + 视频 + 我的）</span><br><span class="line">│       ├── feature_exhibit/   # 办展（列表 + 快速布展 + 观展 + 详情）</span><br><span class="line">│       ├── feature_note/      # 笔记（详情 + 评论 + 互动）</span><br><span class="line">│       └── feature_splash/    # 启动页</span><br><span class="line">├── docs/                      # 项目文档</span><br><span class="line">├── scripts/                   # 构建脚本</span><br><span class="line">├── melos.yaml                 # Melos 配置（Monorepo 管理）</span><br><span class="line">├── pubspec.yaml               # 根 workspace pubspec（声明 melos 依赖）</span><br><span class="line">├── analysis_options.yaml      # 全局静态检查规则</span><br><span class="line">└── README.md                  # 项目说明</span><br></pre></td></tr></table></figure><hr><h2 id="2-Monorepo-子包总览"><a href="#2-Monorepo-子包总览" class="headerlink" title="2. Monorepo 子包总览"></a>2. Monorepo 子包总览</h2><table><thead><tr><th>层级</th><th>包路径</th><th><code>name</code></th><th>说明</th></tr></thead><tbody><tr><td>壳工程</td><td><code>apps/host_app</code></td><td><code>zhanzhan</code></td><td>主入口、路由注册、平台工程</td></tr><tr><td>基础层</td><td><code>packages/core/core_network</code></td><td><code>core_network</code></td><td>Dio 实例、拦截器、Mock</td></tr><tr><td>基础层</td><td><code>packages/core/core_storage</code></td><td><code>core_storage</code></td><td>Token 持久化（SharedPreferences）</td></tr><tr><td>基础层</td><td><code>packages/core/core_router</code></td><td><code>core_router</code></td><td>GoRouter 抽象、全局导航</td></tr><tr><td>基础层</td><td><code>packages/core/core_analytics</code></td><td><code>core_analytics</code></td><td>Matomo 埋点服务</td></tr><tr><td>公共层</td><td><code>packages/common/auth_session</code></td><td><code>auth_session</code></td><td>鉴权守卫、当前用户服务</td></tr><tr><td>公共层</td><td><code>packages/common/design_system</code></td><td><code>design_system</code></td><td>主题颜色/字体/间距 + 通用 UI 组件</td></tr><tr><td>公共层</td><td><code>packages/common/shared_models</code></td><td><code>shared_models</code></td><td>跨模块共享的模型与 Repository</td></tr><tr><td>功能层</td><td><code>packages/features/feature_auth</code></td><td><code>feature_auth</code></td><td>登录/协议</td></tr><tr><td>功能层</td><td><code>packages/features/feature_home</code></td><td><code>feature_home</code></td><td>首页</td></tr><tr><td>功能层</td><td><code>packages/features/feature_exhibit</code></td><td><code>feature_exhibit</code></td><td>办展</td></tr><tr><td>功能层</td><td><code>packages/features/feature_note</code></td><td><code>feature_note</code></td><td>笔记</td></tr><tr><td>功能层</td><td><code>packages/features/feature_splash</code></td><td><code>feature_splash</code></td><td>启动页</td></tr></tbody></table><hr><h2 id="3-壳工程（apps-host-app）"><a href="#3-壳工程（apps-host-app）" class="headerlink" title="3. 壳工程（apps/host_app）"></a>3. 壳工程（apps/host_app）</h2><p>壳工程负责<strong>组装</strong>各个包，提供应用入口和路由注册。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br></pre></td><td class="code"><pre><span class="line">apps/host_app/lib/</span><br><span class="line">├── main.dart                     # 应用入口（ProviderScope、Matomo、依赖注入）</span><br><span class="line">├── app_routes.dart               # 集中路由注册（feature 页面绑定 GoRoute）</span><br><span class="line">├── app/                          # 预留（当前为空）</span><br><span class="line">├── core/                         # 壳工程内部 shim / 胶水代码</span><br><span class="line">│   ├── exceptions/</span><br><span class="line">│   │   └── auth_exceptions.dart     # → 转发 core_network</span><br><span class="line">│   ├── navigation/</span><br><span class="line">│   │   └── app_navigator.dart       # → 转发 core_router</span><br><span class="line">│   ├── network/</span><br><span class="line">│   │   ├── app_network_config.dart  # → 转发 core_network</span><br><span class="line">│   │   ├── auth_interceptor.dart    # → 转发 core_network</span><br><span class="line">│   │   ├── dio_provider.dart        # → 转发 core_network</span><br><span class="line">│   │   ├── empty_string_interceptor.dart</span><br><span class="line">│   │   ├── media_url_resolver.dart</span><br><span class="line">│   │   └── mock/</span><br><span class="line">│   │       ├── mock_config.dart</span><br><span class="line">│   │       └── mock_interceptor.dart</span><br><span class="line">│   ├── services/</span><br><span class="line">│   │   ├── app_analytics_service.dart  # → 转发 core_analytics</span><br><span class="line">│   │   ├── auth_session_guard.dart     # → 转发 auth_session</span><br><span class="line">│   │   ├── current_user_service.dart   # → 转发 auth_session</span><br><span class="line">│   │   └── token_storage_service.dart  # → 转发 core_storage</span><br><span class="line">│   ├── theme/</span><br><span class="line">│   │   ├── app_colors.dart          # → 转发 design_system</span><br><span class="line">│   │   ├── app_dimens.dart</span><br><span class="line">│   │   ├── app_text_styles.dart</span><br><span class="line">│   │   └── app_theme.dart</span><br><span class="line">│   └── widgets/</span><br><span class="line">│       ├── app_dialogs.dart         # → 转发 design_system</span><br><span class="line">│       ├── app_empty_placeholder.dart</span><br><span class="line">│       ├── app_image_loading_placeholder.dart</span><br><span class="line">│       ├── app_modal_sheet.dart</span><br><span class="line">│       ├── app_share_sheet.dart</span><br><span class="line">│       ├── app_skeleton.dart</span><br><span class="line">│       └── app_top_toast.dart</span><br><span class="line">└── features/                     # 壳工程内部 feature shim</span><br><span class="line">    ├── auth/</span><br><span class="line">    │   ├── domain/agreement_type.dart</span><br><span class="line">    │   └── presentation/</span><br><span class="line">    │       ├── agreement/agreement_page.dart</span><br><span class="line">    │       └── login/login_page.dart</span><br><span class="line">    ├── home/</span><br><span class="line">    │   ├── data/home_note_repository.dart</span><br><span class="line">    │   └── presentation/home/</span><br><span class="line">    │       ├── home_my_page.dart</span><br><span class="line">    │       ├── home_note_like_controller.dart</span><br><span class="line">    │       └── home_page.dart</span><br><span class="line">    ├── note/</span><br><span class="line">    │   ├── data/note_interaction_repository.dart</span><br><span class="line">    │   └── presentation/note_detail_page.dart</span><br><span class="line">    └── splash/</span><br><span class="line">        └── presentation/splash_page.dart</span><br></pre></td></tr></table></figure><hr><h2 id="4-基础能力层（packages-core）"><a href="#4-基础能力层（packages-core）" class="headerlink" title="4. 基础能力层（packages/core）"></a>4. 基础能力层（packages/core）</h2><h3 id="4-1-core-network（网络层）"><a href="#4-1-core-network（网络层）" class="headerlink" title="4.1 core_network（网络层）"></a>4.1 core_network（网络层）</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">packages/core/core_network/lib/</span><br><span class="line">├── core_network.dart              # barrel export</span><br><span class="line">└── src/</span><br><span class="line">    ├── app_network_config.dart    # baseUrl、X-Client-Type</span><br><span class="line">    ├── auth_error_handler.dart    # 鉴权失效协议（Provider 抽象）</span><br><span class="line">    ├── auth_exceptions.dart       # 鉴权异常定义</span><br><span class="line">    ├── auth_interceptor.dart      # 请求附加 token、处理鉴权失效</span><br><span class="line">    ├── dio_provider.dart          # Dio 实例创建（@riverpod）</span><br><span class="line">    ├── dio_provider.g.dart        # 生成代码</span><br><span class="line">    ├── empty_string_interceptor.dart # 空字符串过滤</span><br><span class="line">    ├── media_url_resolver.dart    # 媒体 URL 解析</span><br><span class="line">    └── mock/</span><br><span class="line">        ├── mock_config.dart       # Mock 开关</span><br><span class="line">        ├── mock_data.dart         # Mock 数据</span><br><span class="line">        └── mock_interceptor.dart  # Mock 拦截器</span><br></pre></td></tr></table></figure><h3 id="4-2-core-storage（本地存储）"><a href="#4-2-core-storage（本地存储）" class="headerlink" title="4.2 core_storage（本地存储）"></a>4.2 core_storage（本地存储）</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">packages/core/core_storage/lib/</span><br><span class="line">├── core_storage.dart</span><br><span class="line">└── src/</span><br><span class="line">    ├── token_storage_service.dart      # Token 持久化（SharedPreferences）</span><br><span class="line">    └── token_storage_service.g.dart    # 生成代码</span><br></pre></td></tr></table></figure><h3 id="4-3-core-router（路由抽象）"><a href="#4-3-core-router（路由抽象）" class="headerlink" title="4.3 core_router（路由抽象）"></a>4.3 core_router（路由抽象）</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">packages/core/core_router/lib/</span><br><span class="line">├── core_router.dart</span><br><span class="line">└── src/</span><br><span class="line">    ├── app_navigator.dart    # 全局 navigatorKey</span><br><span class="line">    └── app_router.dart       # GoRouter 配置 &amp; AppRouter 静态方法</span><br></pre></td></tr></table></figure><h3 id="4-4-core-analytics（埋点）"><a href="#4-4-core-analytics（埋点）" class="headerlink" title="4.4 core_analytics（埋点）"></a>4.4 core_analytics（埋点）</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">packages/core/core_analytics/lib/</span><br><span class="line">├── core_analytics.dart</span><br><span class="line">└── src/</span><br><span class="line">    └── app_analytics_service.dart    # Matomo Tracker 封装</span><br></pre></td></tr></table></figure><hr><h2 id="5-公共复用层（packages-common）"><a href="#5-公共复用层（packages-common）" class="headerlink" title="5. 公共复用层（packages/common）"></a>5. 公共复用层（packages/common）</h2><h3 id="5-1-auth-session（鉴权会话）"><a href="#5-1-auth-session（鉴权会话）" class="headerlink" title="5.1 auth_session（鉴权会话）"></a>5.1 auth_session（鉴权会话）</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">packages/common/auth_session/lib/</span><br><span class="line">├── auth_session.dart</span><br><span class="line">└── src/</span><br><span class="line">    ├── auth_session_guard.dart     # 登录失效统一处理</span><br><span class="line">    └── current_user_service.dart   # 当前用户信息服务</span><br></pre></td></tr></table></figure><h3 id="5-2-design-system（设计系统）"><a href="#5-2-design-system（设计系统）" class="headerlink" title="5.2 design_system（设计系统）"></a>5.2 design_system（设计系统）</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">packages/common/design_system/lib/</span><br><span class="line">├── design_system.dart</span><br><span class="line">└── src/</span><br><span class="line">    ├── theme/</span><br><span class="line">    │   ├── app_colors.dart</span><br><span class="line">    │   ├── app_dimens.dart</span><br><span class="line">    │   ├── app_text_styles.dart</span><br><span class="line">    │   └── app_theme.dart</span><br><span class="line">    └── widgets/</span><br><span class="line">        ├── app_dialogs.dart</span><br><span class="line">        ├── app_empty_placeholder.dart</span><br><span class="line">        ├── app_image_loading_placeholder.dart</span><br><span class="line">        ├── app_modal_sheet.dart</span><br><span class="line">        ├── app_share_sheet.dart</span><br><span class="line">        ├── app_skeleton.dart</span><br><span class="line">        └── app_top_toast.dart</span><br></pre></td></tr></table></figure><h3 id="5-3-shared-models（共享模型）"><a href="#5-3-shared-models（共享模型）" class="headerlink" title="5.3 shared_models（共享模型）"></a>5.3 shared_models（共享模型）</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line">packages/common/shared_models/lib/</span><br><span class="line">├── shared_models.dart</span><br><span class="line">└── src/</span><br><span class="line">    ├── app_state/</span><br><span class="line">    │   └── cross_feature_state.dart       # 跨功能状态</span><br><span class="line">    ├── exhibit/</span><br><span class="line">    │   ├── exhibit_category.dart</span><br><span class="line">    │   ├── exhibit_category_tree_node.dart</span><br><span class="line">    │   ├── exhibit_chat_message.dart</span><br><span class="line">    │   ├── exhibit_comment_model.dart</span><br><span class="line">    │   ├── exhibit_cover_resolver.dart</span><br><span class="line">    │   ├── exhibit_exhibition_detail.dart</span><br><span class="line">    │   ├── exhibit_frame_material.dart</span><br><span class="line">    │   ├── exhibit_hall.dart</span><br><span class="line">    │   ├── exhibit_hall_template_detail.dart</span><br><span class="line">    │   ├── exhibit_music.dart</span><br><span class="line">    │   ├── exhibit_repository.dart        # 办展 Repository（Dio 接口）</span><br><span class="line">    │   └── fast_exhibit_draft_store.dart   # 快速布展草稿管理</span><br><span class="line">    ├── home/</span><br><span class="line">    │   ├── home_note_like_controller.dart</span><br><span class="line">    │   └── home_note_repository.dart      # 首页笔记 Repository</span><br><span class="line">    ├── note/</span><br><span class="line">    │   └── note_interaction_repository.dart # 笔记互动 Repository</span><br><span class="line">    └── widgets/</span><br><span class="line">        └── exhibit_hall_grid.dart          # 展馆网格组件</span><br></pre></td></tr></table></figure><hr><h2 id="6-业务功能模块（packages-features）"><a href="#6-业务功能模块（packages-features）" class="headerlink" title="6. 业务功能模块（packages/features）"></a>6. 业务功能模块（packages/features）</h2><h3 id="6-1-feature-auth（登录-注册-协议）"><a href="#6-1-feature-auth（登录-注册-协议）" class="headerlink" title="6.1 feature_auth（登录/注册/协议）"></a>6.1 feature_auth（登录/注册/协议）</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">packages/features/feature_auth/lib/</span><br><span class="line">├── feature_auth.dart</span><br><span class="line">└── src/</span><br><span class="line">    ├── data/</span><br><span class="line">    │   ├── agreement_repository.dart     # 协议接口</span><br><span class="line">    │   ├── auth_repository.dart          # 鉴权接口（验证码登录）</span><br><span class="line">    │   └── auth_repository.g.dart</span><br><span class="line">    ├── domain/</span><br><span class="line">    │   ├── agreement.dart</span><br><span class="line">    │   ├── agreement_type.dart</span><br><span class="line">    │   └── login_form.dart</span><br><span class="line">    └── presentation/</span><br><span class="line">        ├── agreement/</span><br><span class="line">        │   ├── agreement_page.dart</span><br><span class="line">        │   └── agreement_provider.dart</span><br><span class="line">        └── login/</span><br><span class="line">            ├── login_controller.dart</span><br><span class="line">            ├── login_controller.g.dart</span><br><span class="line">            └── login_page.dart</span><br></pre></td></tr></table></figure><h3 id="6-2-feature-home（首页）"><a href="#6-2-feature-home（首页）" class="headerlink" title="6.2 feature_home（首页）"></a>6.2 feature_home（首页）</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">packages/features/feature_home/lib/</span><br><span class="line">├── feature_home.dart</span><br><span class="line">└── src/</span><br><span class="line">    ├── domain/</span><br><span class="line">    │   ├── home_note.dart</span><br><span class="line">    │   └── home_video.dart</span><br><span class="line">    └── presentation/</span><br><span class="line">        ├── widgets/</span><br><span class="line">        │   └── custom_curated_nav_bar.dart</span><br><span class="line">        └── home/</span><br><span class="line">            ├── home_create_note_page.dart</span><br><span class="line">            ├── home_edit_profile_page.dart</span><br><span class="line">            ├── home_feed_controller.dart / .g.dart</span><br><span class="line">            ├── home_my_page.dart</span><br><span class="line">            ├── home_page.dart</span><br><span class="line">            ├── home_video_controller.dart / .g.dart</span><br><span class="line">            ├── home_video_interaction_controller.dart / .g.dart</span><br><span class="line">            ├── home_video_tab_page.dart</span><br><span class="line">            ├── qr_scan_page.dart</span><br><span class="line">            └── widgets/</span><br><span class="line">                └── home_note_media_cover.dart</span><br></pre></td></tr></table></figure><h3 id="6-3-feature-exhibit（办展）"><a href="#6-3-feature-exhibit（办展）" class="headerlink" title="6.3 feature_exhibit（办展）"></a>6.3 feature_exhibit（办展）</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line">packages/features/feature_exhibit/lib/</span><br><span class="line">├── feature_exhibit.dart</span><br><span class="line">└── src/</span><br><span class="line">    ├── domain/</span><br><span class="line">    │   └── exhibit_hall_draft.dart</span><br><span class="line">    └── presentation/</span><br><span class="line">        ├── cover/</span><br><span class="line">        │   └── exhibit_cover_page_template_1.dart</span><br><span class="line">        ├── detail/</span><br><span class="line">        │   ├── exhibit_artwork_comment_controller.dart</span><br><span class="line">        │   ├── exhibit_artwork_comment_page_template_1.dart</span><br><span class="line">        │   ├── exhibit_artwork_detail_page_template_1.dart</span><br><span class="line">        │   ├── exhibit_detail_page_template_1.dart</span><br><span class="line">        │   ├── exhibit_detail_page_type_1.dart</span><br><span class="line">        │   ├── exhibit_detail_page_type_2.dart</span><br><span class="line">        │   ├── exhibit_detail_page_type_3.dart</span><br><span class="line">        │   ├── exhibit_hall_draft_controller.dart</span><br><span class="line">        │   ├── exhibit_hall_template_detail_controller.dart</span><br><span class="line">        │   ├── exhibit_hall_template_detail_page.dart</span><br><span class="line">        │   └── exhibition_3d_page.dart</span><br><span class="line">        ├── exhibit_tab/</span><br><span class="line">        │   ├── exhibit_tab_controller.dart / .g.dart</span><br><span class="line">        │   └── exhibit_tab_page.dart</span><br><span class="line">        ├── fast_exhibit/</span><br><span class="line">        │   ├── fast_exhibit_page.dart</span><br><span class="line">        │   ├── fast_exhibit_publish_page.dart</span><br><span class="line">        │   └── widgets/</span><br><span class="line">        │       └── fast_exhibit_sheets.dart</span><br><span class="line">        ├── viewing/</span><br><span class="line">        │   ├── exhibit_viewing_page_template_1.dart</span><br><span class="line">        │   └── exhibit_viewing_scene_mock_store.dart</span><br><span class="line">        └── widgets/</span><br><span class="line">            ├── exhibit_info_widgets.dart</span><br><span class="line">            └── exhibit_wall_artworks_perspective.dart</span><br></pre></td></tr></table></figure><h3 id="6-4-feature-note（笔记）"><a href="#6-4-feature-note（笔记）" class="headerlink" title="6.4 feature_note（笔记）"></a>6.4 feature_note（笔记）</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">packages/features/feature_note/lib/</span><br><span class="line">├── feature_note.dart</span><br><span class="line">└── src/</span><br><span class="line">    ├── data/</span><br><span class="line">    │   └── note_comment_repository.dart</span><br><span class="line">    ├── domain/</span><br><span class="line">    │   └── note_comment_model.dart</span><br><span class="line">    └── presentation/</span><br><span class="line">        ├── note_comment_controller.dart</span><br><span class="line">        ├── note_detail_controller.dart</span><br><span class="line">        ├── note_detail_page.dart</span><br><span class="line">        ├── note_interaction_controller.dart</span><br><span class="line">        └── widgets/</span><br><span class="line">            ├── note_comment_item.dart</span><br><span class="line">            ├── note_comment_section.dart</span><br><span class="line">            ├── note_detail_bottom_bar.dart</span><br><span class="line">            └── note_image_gallery_page.dart</span><br></pre></td></tr></table></figure><h3 id="6-5-feature-splash（启动页）"><a href="#6-5-feature-splash（启动页）" class="headerlink" title="6.5 feature_splash（启动页）"></a>6.5 feature_splash（启动页）</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">packages/features/feature_splash/lib/</span><br><span class="line">├── feature_splash.dart</span><br><span class="line">└── src/</span><br><span class="line">    └── splash_page.dart</span><br></pre></td></tr></table></figure><hr><h2 id="7-数据接口与-Repository-映射"><a href="#7-数据接口与-Repository-映射" class="headerlink" title="7. 数据接口与 Repository 映射"></a>7. 数据接口与 Repository 映射</h2><blockquote><p>详细接口原始文档见：<code>docs/api.md</code>。</p></blockquote><h3 id="7-1-鉴权-用户相关"><a href="#7-1-鉴权-用户相关" class="headerlink" title="7.1 鉴权/用户相关"></a>7.1 鉴权/用户相关</h3><ul><li><p><strong><code>AuthRepository</code></strong>（<code>feature_auth</code>）</p><ul><li><code>GET /sms/amaz/wxapp/send_sms</code>（发送验证码）</li><li><code>POST /sms/amaz/wxapp/verify_sms</code>（验证码登录）</li></ul></li><li><p><strong><code>AgreementRepository</code></strong>（<code>feature_auth</code>）</p><ul><li><code>GET /user/sys/agreement/get</code>（协议内容）</li></ul></li><li><p><strong><code>CurrentUserService</code></strong>（<code>auth_session</code>）</p><ul><li><code>GET /user/amaz/user/info</code>（用户信息）</li><li><code>POST /user/amaz/user/update</code>（更新资料）</li></ul></li></ul><h3 id="7-2-办展相关"><a href="#7-2-办展相关" class="headerlink" title="7.2 办展相关"></a>7.2 办展相关</h3><ul><li><strong><code>ExhibitRepository</code></strong>（<code>shared_models</code>）<ul><li>分类：<code>/api/exhibition/category/list</code>、<code>/api/exhibition/category/tree</code></li><li>音乐：<code>/api/music/system/normal</code></li><li>展览列表/详情：<code>/api/exhibition/list</code>、<code>/api/exhibition/{id}</code></li><li>展览流：<code>/api/information/exhibition/get</code></li><li>互动聊天：<code>/api/exhibition/interact/chat/list</code>、<code>/api/exhibition/interact/chat/add</code></li><li>评论：<code>/api/exhibition/comment/list</code>、<code>/api/exhibition/comment/add</code>、<code>/api/exhibition/interact/comment/delete</code></li><li>模板：<code>/api/exhibition/hall/template/{templateId}</code>、<code>/api/exhibition/hall/template/page</code></li><li>发布：<code>/api/exhibition/saveOrUpdate</code></li></ul></li></ul><h3 id="7-3-首页-笔记相关"><a href="#7-3-首页-笔记相关" class="headerlink" title="7.3 首页/笔记相关"></a>7.3 首页/笔记相关</h3><ul><li><p><strong><code>HomeNoteRepository</code></strong>（<code>shared_models</code>）</p><ul><li>信息流：<code>/api/information/follow/get</code></li><li>笔记列表：<code>/api/information/note/get</code></li><li>点赞列表：<code>/api/note/take/home/like/list</code></li><li>评论列表：<code>/api/note/take/home/list</code></li><li>详情：<code>/api/note/take/detail</code></li><li>创建/编辑：<code>/api/note/edit/create_modify</code></li></ul></li><li><p><strong><code>NoteCommentRepository</code></strong>（<code>feature_note</code>）</p><ul><li>评论列表：<code>/api/note/take/list</code></li><li>评论新增：<code>/api/note/take/add</code></li></ul></li><li><p><strong><code>NoteInteractionRepository</code></strong>（<code>shared_models</code>）</p><ul><li>关注：<code>/user/amaz/user/add</code>、<code>/user/amaz/user/cancel</code></li><li>点赞/收藏：<code>/user/like/divide/add</code>、<code>/user/like/divide/cancel</code></li></ul></li></ul><hr><h2 id="8-Provider-与状态管理分布"><a href="#8-Provider-与状态管理分布" class="headerlink" title="8. Provider 与状态管理分布"></a>8. Provider 与状态管理分布</h2><ul><li>全局网络与服务：<ul><li><code>dioProvider</code>（<code>core_network</code>）</li><li><code>tokenStorageServiceProvider</code>（<code>core_storage</code>）</li><li><code>currentUserServiceProvider</code>（<code>auth_session</code>）</li><li><code>authErrorHandlerProvider</code>（<code>core_network</code>，壳工程注入实现）</li></ul></li><li>功能 Repository Provider：<ul><li><code>authRepositoryProvider</code>（<code>feature_auth</code>）</li><li><code>agreementRepositoryProvider</code>（<code>feature_auth</code>）</li><li><code>exhibitRepositoryProvider</code>（<code>shared_models</code>）</li><li><code>homeNoteRepositoryProvider</code>（<code>shared_models</code>）</li><li><code>noteCommentRepositoryProvider</code>（<code>feature_note</code>）</li><li><code>noteInteractionRepositoryProvider</code>（<code>shared_models</code>）</li></ul></li><li>控制器（<code>@riverpod</code> / Notifier）：<ul><li><code>LoginController</code>（<code>feature_auth</code>）</li><li><code>ExhibitTabController</code>（<code>feature_exhibit</code>）</li><li><code>HomeFeedController</code>（<code>feature_home</code>）</li><li><code>HomeVideoController</code>（<code>feature_home</code>）</li><li><code>HomeVideoInteractionController</code>（<code>feature_home</code>）</li><li><code>NoteDetailController</code>（<code>feature_note</code>）</li><li><code>NoteCommentController</code>（<code>feature_note</code>）</li><li><code>NoteInteractionController</code>（<code>feature_note</code>）</li></ul></li></ul><hr>]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;1-背景与痛点-Situation-amp-Task&quot;&gt;&lt;a href=&quot;#1-背景与痛点-Situation-amp-Task&quot; class=&quot;headerlink&quot; title=&quot;1. 背景与痛点 (Situation &amp;amp; Task)&quot;&gt;&lt;/a&gt;1. 背景与痛点 (Situation &amp;amp; Task)&lt;/h2&gt;&lt;p&gt;在项目（Zhanzhan）初期，为了追求业务的快速迭代，我们采用了传统的 Flutter 单体工程（Monolith）架构。所有的业务逻辑、网络请求、UI 组件和路由都高度集中在同一个 &lt;code&gt;lib&lt;/code&gt; 目录下。&lt;/p&gt;
&lt;p&gt;随着业务场景的不断丰富（涵盖了“办展”、“看展笔记”、“信息流”、“个人中心”等多个核心域），单体架构的弊端开始集中爆发，主要体现在：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;代码边界模糊，陷入“面条代码”：&lt;/strong&gt; 业务模块之间直接互相 &lt;code&gt;import&lt;/code&gt; 页面类，导致严重的隐式耦合。改动“商城”模块的代码，可能会意外引发“看展”模块的崩溃。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;依赖冲突频发，包管理失控：&lt;/strong&gt; 全局共用一个 &lt;code&gt;pubspec.yaml&lt;/code&gt;，第三方依赖版本牵一发而动全身，极大地限制了不同业务线的技术选型自由度。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;编译与代码生成效率低下：&lt;/strong&gt; 在单体架构下，运行一次 &lt;code&gt;build_runner&lt;/code&gt; 生成代码需要遍历全局，耗时极长，严重影响研发心智和效率。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;为了支撑中大型团队的协同开发，抹平不同业务模块的进度差，我们决定彻底打破单体架构，全面向 &lt;strong&gt;基于 Melos 的 Monorepo（单体仓库多包管理）架构&lt;/strong&gt; 演进。    &lt;/p&gt;
    
    </summary>
    
      <category term="学习笔记" scheme="https://blogs.kainy.cn/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
      <category term="建站❤编程" scheme="https://blogs.kainy.cn/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E5%BB%BA%E7%AB%99%E2%9D%A4%E7%BC%96%E7%A8%8B/"/>
    
    
      <category term="App" scheme="https://blogs.kainy.cn/tags/App/"/>
    
      <category term="Flutter" scheme="https://blogs.kainy.cn/tags/Flutter/"/>
    
  </entry>
  
  <entry>
    <title>小程序｜公众号信息查询API文档</title>
    <link href="https://blogs.kainy.cn/2026/04/&#39;%E5%B0%8F%E7%A8%8B%E5%BA%8F%EF%BD%9C%E5%85%AC%E4%BC%97%E5%8F%B7%E4%BF%A1%E6%81%AF%E6%9F%A5%E8%AF%A2API%E6%96%87%E6%A1%A3&#39;/"/>
    <id>https://blogs.kainy.cn/2026/04/&#39;小程序｜公众号信息查询API文档&#39;/</id>
    <published>2026-04-14T23:03:13.000Z</published>
    <updated>2026-08-01T09:28:07.936Z</updated>
    
    <content type="html"><![CDATA[<p>API key 获取地址：<a href="https://open.kainy.cn/register/?f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" rel="external nofollow noopener" referrerpolicy="unsafe-url" target="_blank">https://open.kainy.cn/register/</a></p><h2 id="GET-微信头像外链"><a href="#GET-微信头像外链" class="headerlink" title="GET 微信头像外链"></a>GET 微信头像外链</h2><p>GET <a href="https://open.kainy.cn/api/wxAvatar?f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" rel="external nofollow noopener" referrerpolicy="unsafe-url" target="_blank">https://open.kainy.cn/api/wxAvatar</a></p><p>微信禁止直接外链用户头像，通过此接口，可以绕过限制。</p><h3 id="请求参数"><a href="#请求参数" class="headerlink" title="请求参数"></a>请求参数</h3><table><thead><tr><th>名称</th><th>位置</th><th>类型</th><th>必选</th><th>说明</th></tr></thead><tbody><tr><td>url</td><td>query</td><td>string</td><td>是</td><td>原始头像地址</td></tr><tr><td>ak</td><td>query</td><td>string</td><td>否</td><td>api-key，可通过URL传递，如不填写，请通过header 的 x-api-key 传递。</td></tr><tr><td>x-api-key</td><td>header</td><td>string</td><td>否</td><td>none</td></tr></tbody></table><a id="more"></a><blockquote><p>返回示例</p></blockquote><blockquote><p>200 Response</p></blockquote><h3 id="返回结果"><a href="#返回结果" class="headerlink" title="返回结果"></a>返回结果</h3><table><thead><tr><th>状态码</th><th>状态码含义</th><th>说明</th><th>数据模型</th></tr></thead><tbody><tr><td>200</td><td><a href="https://tools.ietf.org/html/rfc7231?f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE#section-6.3.1" rel="external nofollow noopener" referrerpolicy="unsafe-url" target="_blank">OK</a></td><td>none</td><td>Inline</td></tr></tbody></table><h3 id="返回数据结构"><a href="#返回数据结构" class="headerlink" title="返回数据结构"></a>返回数据结构</h3><h2 id="POST-根据-appid-名称-查小程序"><a href="#POST-根据-appid-名称-查小程序" class="headerlink" title="POST 根据 appid/名称 查小程序"></a>POST 根据 appid/名称 查小程序</h2><p>POST <a href="https://open.kainy.cn/api/AppidQuery?f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" rel="external nofollow noopener" referrerpolicy="unsafe-url" target="_blank">https://open.kainy.cn/api/AppidQuery</a></p><p>根据appid或名称查询小程序信息，包括未备案和未实名以及已下架的小程序。</p><blockquote><p>Body 请求参数</p></blockquote><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  <span class="attr">"appid"</span>: <span class="string">"wx109bf438c8cc1b8b"</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="请求参数-1"><a href="#请求参数-1" class="headerlink" title="请求参数"></a>请求参数</h3><table><thead><tr><th>名称</th><th>位置</th><th>类型</th><th>必选</th><th>说明</th></tr></thead><tbody><tr><td>x-api-key</td><td>header</td><td>string</td><td>否</td><td>none</td></tr><tr><td>body</td><td>body</td><td>object</td><td>是</td><td>none</td></tr><tr><td>» appid</td><td>body</td><td>string</td><td>是</td><td>none</td></tr></tbody></table><blockquote><p>返回示例</p></blockquote><blockquote><p>200 Response</p></blockquote><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  <span class="attr">"code"</span>: <span class="number">0</span>,</span><br><span class="line">  <span class="attr">"data"</span>: &#123;</span><br><span class="line">    <span class="attr">"nickname"</span>: <span class="string">"AppID查"</span>,</span><br><span class="line">    <span class="attr">"username"</span>: <span class="string">"gh_b9c4a08a2031"</span>,</span><br><span class="line">    <span class="attr">"description"</span>: <span class="string">"输入AppID查询小程序名称和详情。小程序间跳转流量来源分析工具；小程序广告投放、买量换量权威验证渠道；小程序运营必备神器。"</span>,</span><br><span class="line">    <span class="attr">"avatar"</span>: <span class="string">"https://wx.qlogo.cn/mmhead/Q3auHgzwzM6t3pXahwQx3y0m5BoFbK0gickbNLkUlbqKuJOhnojVfYg/0"</span>,</span><br><span class="line">    <span class="attr">"uses_count"</span>: <span class="string">"0"</span>,</span><br><span class="line">    <span class="attr">"principal_name"</span>: <span class="string">"个人开发者"</span>,</span><br><span class="line">    <span class="attr">"appid"</span>: <span class="string">"wx109bf438c8cc1b8b"</span></span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="返回结果-1"><a href="#返回结果-1" class="headerlink" title="返回结果"></a>返回结果</h3><table><thead><tr><th>状态码</th><th>状态码含义</th><th>说明</th><th>数据模型</th></tr></thead><tbody><tr><td>200</td><td><a href="https://tools.ietf.org/html/rfc7231?f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE#section-6.3.1" rel="external nofollow noopener" referrerpolicy="unsafe-url" target="_blank">OK</a></td><td>none</td><td>Inline</td></tr></tbody></table><h3 id="返回数据结构-1"><a href="#返回数据结构-1" class="headerlink" title="返回数据结构"></a>返回数据结构</h3><p>状态码 <strong>200</strong></p><table><thead><tr><th>名称</th><th>类型</th><th>必选</th><th>约束</th><th>中文名</th><th>说明</th></tr></thead><tbody><tr><td>» code</td><td>integer</td><td>true</td><td>none</td><td></td><td>none</td></tr><tr><td>» data</td><td>object</td><td>true</td><td>none</td><td></td><td>none</td></tr><tr><td>»» nickname</td><td>string</td><td>true</td><td>none</td><td>昵称</td><td>none</td></tr><tr><td>»» username</td><td>string</td><td>true</td><td>none</td><td>原始id</td><td>none</td></tr><tr><td>»» description</td><td>string</td><td>true</td><td>none</td><td>小程序简介</td><td>none</td></tr><tr><td>»» avatar</td><td>string</td><td>true</td><td>none</td><td>小程序图标</td><td>none</td></tr><tr><td>»» uses_count</td><td>string</td><td>true</td><td>none</td><td>使用次数</td><td>none</td></tr><tr><td>»» principal_name</td><td>string</td><td>true</td><td>none</td><td>主体名称</td><td>none</td></tr><tr><td>»» appid</td><td>string</td><td>true</td><td>none</td><td>Appid</td><td>none</td></tr></tbody></table><h2 id="GET-根据-appid-查公众号信息"><a href="#GET-根据-appid-查公众号信息" class="headerlink" title="GET 根据 appid 查公众号信息"></a>GET 根据 appid 查公众号信息</h2><p>GET <a href="https://open.kainy.cn/api/mpAppidQuery?f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" rel="external nofollow noopener" referrerpolicy="unsafe-url" target="_blank">https://open.kainy.cn/api/mpAppidQuery</a></p><p>根据appid或名称查询公众号和小程序信息，包括未备案和未实名以及已下架的。</p><h3 id="请求参数-2"><a href="#请求参数-2" class="headerlink" title="请求参数"></a>请求参数</h3><table><thead><tr><th>名称</th><th>位置</th><th>类型</th><th>必选</th><th>说明</th></tr></thead><tbody><tr><td>appid</td><td>query</td><td>string</td><td>是</td><td>公众号/小程序的appid</td></tr><tr><td>x-api-key</td><td>header</td><td>string</td><td>否</td><td>none</td></tr></tbody></table><blockquote><p>返回示例</p></blockquote><blockquote><p>200 Response</p></blockquote><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  <span class="attr">"code"</span>: <span class="number">0</span>,</span><br><span class="line">  <span class="attr">"data"</span>: &#123;</span><br><span class="line">    <span class="attr">"nickname"</span>: <span class="string">"AppID查"</span>,</span><br><span class="line">    <span class="attr">"username"</span>: <span class="string">"gh_b9c4a08a2031"</span>,</span><br><span class="line">    <span class="attr">"description"</span>: <span class="string">"输入AppID查询小程序名称和详情。小程序间跳转流量来源分析工具；小程序广告投放、买量换量权威验证渠道；小程序运营必备神器。"</span>,</span><br><span class="line">    <span class="attr">"avatar"</span>: <span class="string">"https://wx.qlogo.cn/mmhead/Q3auHgzwzM6t3pXahwQx3y0m5BoFbK0gickbNLkUlbqKuJOhnojVfYg/0"</span>,</span><br><span class="line">    <span class="attr">"uses_count"</span>: <span class="string">"0"</span>,</span><br><span class="line">    <span class="attr">"principal_name"</span>: <span class="string">"个人开发者"</span>,</span><br><span class="line">    <span class="attr">"appid"</span>: <span class="string">"wx109bf438c8cc1b8b"</span></span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="返回结果-2"><a href="#返回结果-2" class="headerlink" title="返回结果"></a>返回结果</h3><table><thead><tr><th>状态码</th><th>状态码含义</th><th>说明</th><th>数据模型</th></tr></thead><tbody><tr><td>200</td><td><a href="https://tools.ietf.org/html/rfc7231?f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE#section-6.3.1" rel="external nofollow noopener" referrerpolicy="unsafe-url" target="_blank">OK</a></td><td>none</td><td>Inline</td></tr></tbody></table><h3 id="返回数据结构-2"><a href="#返回数据结构-2" class="headerlink" title="返回数据结构"></a>返回数据结构</h3><p>状态码 <strong>200</strong></p><table><thead><tr><th>名称</th><th>类型</th><th>必选</th><th>约束</th><th>中文名</th><th>说明</th></tr></thead><tbody><tr><td>» code</td><td>integer</td><td>true</td><td>none</td><td></td><td>none</td></tr><tr><td>» data</td><td>object</td><td>true</td><td>none</td><td></td><td>none</td></tr><tr><td>»» nickname</td><td>string</td><td>true</td><td>none</td><td>昵称</td><td>none</td></tr><tr><td>»» username</td><td>string</td><td>true</td><td>none</td><td>原始id</td><td>none</td></tr><tr><td>»» description</td><td>string</td><td>true</td><td>none</td><td>小程序简介</td><td>none</td></tr><tr><td>»» avatar</td><td>string</td><td>true</td><td>none</td><td>小程序图标</td><td>none</td></tr><tr><td>»» uses_count</td><td>string</td><td>true</td><td>none</td><td>使用次数</td><td>none</td></tr><tr><td>»» principal_name</td><td>string</td><td>true</td><td>none</td><td>主体名称</td><td>none</td></tr><tr><td>»» appid</td><td>string</td><td>true</td><td>none</td><td>Appid</td><td>none</td></tr></tbody></table><h2 id="GET-小程序搜索提示词列表"><a href="#GET-小程序搜索提示词列表" class="headerlink" title="GET 小程序搜索提示词列表"></a>GET 小程序搜索提示词列表</h2><p>GET <a href="https://open.kainy.cn/api/weapp-suggest?f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" rel="external nofollow noopener" referrerpolicy="unsafe-url" target="_blank">https://open.kainy.cn/api/weapp-suggest</a></p><p>根据关键词，联想小程序名称。</p><h3 id="请求参数-3"><a href="#请求参数-3" class="headerlink" title="请求参数"></a>请求参数</h3><table><thead><tr><th>名称</th><th>位置</th><th>类型</th><th>必选</th><th>说明</th></tr></thead><tbody><tr><td>appid</td><td>query</td><td>string</td><td>是</td><td>联想关键词</td></tr><tr><td>x-api-key</td><td>header</td><td>string</td><td>否</td><td>none</td></tr></tbody></table><blockquote><p>返回示例</p></blockquote><blockquote><p>200 Response</p></blockquote><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  <span class="attr">"code"</span>: <span class="number">0</span>,</span><br><span class="line">  <span class="attr">"data"</span>: [</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">"nickname"</span>: <span class="string">"腾讯流量"</span></span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">"nickname"</span>: <span class="string">"腾讯动漫官方微主页"</span></span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">"nickname"</span>: <span class="string">"腾讯微课堂"</span></span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">"nickname"</span>: <span class="string">"腾讯AI名片"</span></span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">"nickname"</span>: <span class="string">"腾讯云游戏"</span></span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">"nickname"</span>: <span class="string">"腾讯视频IP好物集"</span></span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">"nickname"</span>: <span class="string">"腾讯智慧零售中心"</span></span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">"nickname"</span>: <span class="string">"腾讯读书酱丨旧版"</span></span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">"nickname"</span>: <span class="string">"腾讯双扣"</span></span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">"nickname"</span>: <span class="string">"腾讯跑得快"</span></span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">"nickname"</span>: <span class="string">"腾讯视频VIP礼品卡"</span></span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">"nickname"</span>: <span class="string">"腾讯开心鼠英语ABCmouse资源站"</span></span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">"nickname"</span>: <span class="string">"腾讯云数字会务平台"</span></span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">"nickname"</span>: <span class="string">"腾讯健康药箱"</span></span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">"nickname"</span>: <span class="string">"腾讯挂号平台"</span></span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">"nickname"</span>: <span class="string">"腾讯文档打卡"</span></span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">"nickname"</span>: <span class="string">"流言侦探腾讯版"</span></span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">"nickname"</span>: <span class="string">"腾讯微保"</span></span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">"nickname"</span>: <span class="string">"腾讯社交广告"</span></span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">"nickname"</span>: <span class="string">"腾讯企鹅辅导"</span></span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">"nickname"</span>: <span class="string">"腾讯云上社区"</span></span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">"nickname"</span>: <span class="string">"腾讯设计周"</span></span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">"nickname"</span>: <span class="string">"腾讯微卡访客助手"</span></span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">"nickname"</span>: <span class="string">"腾讯云智服工作台"</span></span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">"nickname"</span>: <span class="string">"腾讯全民模拟炒股大赛"</span></span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">"nickname"</span>: <span class="string">"腾讯调研云"</span></span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">"nickname"</span>: <span class="string">"腾讯出行"</span></span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">"nickname"</span>: <span class="string">"腾讯动漫"</span></span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">"nickname"</span>: <span class="string">"腾讯开心鼠启蒙"</span></span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">"nickname"</span>: <span class="string">"腾讯企业邮箱"</span></span><br><span class="line">    &#125;</span><br><span class="line">  ]</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="返回结果-3"><a href="#返回结果-3" class="headerlink" title="返回结果"></a>返回结果</h3><table><thead><tr><th>状态码</th><th>状态码含义</th><th>说明</th><th>数据模型</th></tr></thead><tbody><tr><td>200</td><td><a href="https://tools.ietf.org/html/rfc7231?f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE#section-6.3.1" rel="external nofollow noopener" referrerpolicy="unsafe-url" target="_blank">OK</a></td><td>none</td><td>Inline</td></tr></tbody></table><h3 id="返回数据结构-3"><a href="#返回数据结构-3" class="headerlink" title="返回数据结构"></a>返回数据结构</h3><p>状态码 <strong>200</strong></p><table><thead><tr><th>名称</th><th>类型</th><th>必选</th><th>约束</th><th>中文名</th><th>说明</th></tr></thead><tbody><tr><td>» code</td><td>integer</td><td>true</td><td>none</td><td></td><td>none</td></tr><tr><td>» data</td><td>[object]</td><td>true</td><td>none</td><td></td><td>none</td></tr><tr><td>»» nickname</td><td>string</td><td>true</td><td>none</td><td></td><td>none</td></tr></tbody></table><h2 id="POST-二进制cookie解析"><a href="#POST-二进制cookie解析" class="headerlink" title="POST 二进制cookie解析"></a>POST 二进制cookie解析</h2><p>POST <a href="https://open.kainy.cn/api/binarycookies?f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" rel="external nofollow noopener" referrerpolicy="unsafe-url" target="_blank">https://open.kainy.cn/api/binarycookies</a></p><p>用于解析Safari浏览器导出的cookie二进制文件，使用场景包括手机上的煤炉账号转移到电脑指纹浏览器等。</p><blockquote><p>Body 请求参数</p></blockquote><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">file:</span> <span class="string">cmMtdXBsb2FkLTE3NzY0MDQ0MzI4MzAtNw==/1.binarycookies</span></span><br></pre></td></tr></table></figure><h3 id="请求参数-4"><a href="#请求参数-4" class="headerlink" title="请求参数"></a>请求参数</h3><table><thead><tr><th>名称</th><th>位置</th><th>类型</th><th>必选</th><th>说明</th></tr></thead><tbody><tr><td>X-Api-Key</td><td>header</td><td>string</td><td>否</td><td>none</td></tr><tr><td>body</td><td>body</td><td>object</td><td>是</td><td>none</td></tr><tr><td>» file</td><td>body</td><td>string(binary)</td><td>否</td><td>有效的 Safari Cookies.binarycookies 文件</td></tr></tbody></table><blockquote><p>返回示例</p></blockquote><blockquote><p>200 Response</p></blockquote><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br></pre></td><td class="code"><pre><span class="line">[</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="attr">"domain"</span>: <span class="string">"auth.mercari.com"</span>,</span><br><span class="line">    <span class="attr">"name"</span>: <span class="string">"op_sess"</span>,</span><br><span class="line">    <span class="attr">"value"</span>: <span class="string">"dbb23136-4717-4da7-9b1f-3ef9f0e59926"</span>,</span><br><span class="line">    <span class="attr">"path"</span>: <span class="string">"/"</span>,</span><br><span class="line">    <span class="attr">"secure"</span>: <span class="literal">false</span>,</span><br><span class="line">    <span class="attr">"httpOnly"</span>: <span class="literal">false</span>,</span><br><span class="line">    <span class="attr">"sameSite"</span>: <span class="string">"unspecified"</span>,</span><br><span class="line">    <span class="attr">"hostOnly"</span>: <span class="literal">false</span>,</span><br><span class="line">    <span class="attr">"storeId"</span>: <span class="string">"0"</span>,</span><br><span class="line">    <span class="attr">"session"</span>: <span class="literal">false</span>,</span><br><span class="line">    <span class="attr">"expirationDate"</span>: <span class="number">1849870081</span>,</span><br><span class="line">    <span class="attr">"creationDate"</span>: <span class="number">1763470081</span></span><br><span class="line">  &#125;,</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="attr">"domain"</span>: <span class="string">".login.jp.mercari.com"</span>,</span><br><span class="line">    <span class="attr">"name"</span>: <span class="string">"__cf_bm"</span>,</span><br><span class="line">    <span class="attr">"value"</span>: <span class="string">"H1l5BcX4FUpy6dQrP9vS12kgBx0bdaHyYfn_rRSFv2o-1763469966-1.0.1.1-WEB_96uUFNqgtpOd0xyub5Xi5QnCJTxq.W9k_2qsIghTOYZSmfOmu7BhEZ.AqgYtBariSXI2rXLxhY2IvY6jq9c2m8fwPb1z5H8fFrXQzQU"</span>,</span><br><span class="line">    <span class="attr">"path"</span>: <span class="string">"/"</span>,</span><br><span class="line">    <span class="attr">"secure"</span>: <span class="literal">true</span>,</span><br><span class="line">    <span class="attr">"httpOnly"</span>: <span class="literal">true</span>,</span><br><span class="line">    <span class="attr">"sameSite"</span>: <span class="string">"unspecified"</span>,</span><br><span class="line">    <span class="attr">"hostOnly"</span>: <span class="literal">false</span>,</span><br><span class="line">    <span class="attr">"storeId"</span>: <span class="string">"0"</span>,</span><br><span class="line">    <span class="attr">"session"</span>: <span class="literal">false</span>,</span><br><span class="line">    <span class="attr">"expirationDate"</span>: <span class="number">1763471766</span>,</span><br><span class="line">    <span class="attr">"creationDate"</span>: <span class="number">1763469967</span></span><br><span class="line">  &#125;,</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="attr">"domain"</span>: <span class="string">".mercari.com"</span>,</span><br><span class="line">    <span class="attr">"name"</span>: <span class="string">"_gcl_au"</span>,</span><br><span class="line">    <span class="attr">"value"</span>: <span class="string">"1.1.1754395915.1763469956"</span>,</span><br><span class="line">    <span class="attr">"path"</span>: <span class="string">"/"</span>,</span><br><span class="line">    <span class="attr">"secure"</span>: <span class="literal">false</span>,</span><br><span class="line">    <span class="attr">"httpOnly"</span>: <span class="literal">false</span>,</span><br><span class="line">    <span class="attr">"sameSite"</span>: <span class="string">"unspecified"</span>,</span><br><span class="line">    <span class="attr">"hostOnly"</span>: <span class="literal">false</span>,</span><br><span class="line">    <span class="attr">"storeId"</span>: <span class="string">"0"</span>,</span><br><span class="line">    <span class="attr">"session"</span>: <span class="literal">false</span>,</span><br><span class="line">    <span class="attr">"expirationDate"</span>: <span class="number">1771245956</span>,</span><br><span class="line">    <span class="attr">"creationDate"</span>: <span class="number">1763469962</span></span><br><span class="line">  &#125;,</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="attr">"domain"</span>: <span class="string">".auth.mercari.com"</span>,</span><br><span class="line">    <span class="attr">"name"</span>: <span class="string">"__cf_bm"</span>,</span><br><span class="line">    <span class="attr">"value"</span>: <span class="string">"hvCyN442KDZqwBMZ5g98tOapPhoMIC.1Gu.g2popfq8-1763470081-1.0.1.1-v.NE1HmB7iVs6o66rCRRzRAD153OtH8Ap8BXI2EVsml7XjCwCbqSU84lj99JXjvjRjyLWYq6fyct9oI2aMz2L5pNSJNowapC_MYKSFe.MqM"</span>,</span><br><span class="line">    <span class="attr">"path"</span>: <span class="string">"/"</span>,</span><br><span class="line">    <span class="attr">"secure"</span>: <span class="literal">true</span>,</span><br><span class="line">    <span class="attr">"httpOnly"</span>: <span class="literal">true</span>,</span><br><span class="line">    <span class="attr">"sameSite"</span>: <span class="string">"unspecified"</span>,</span><br><span class="line">    <span class="attr">"hostOnly"</span>: <span class="literal">false</span>,</span><br><span class="line">    <span class="attr">"storeId"</span>: <span class="string">"0"</span>,</span><br><span class="line">    <span class="attr">"session"</span>: <span class="literal">false</span>,</span><br><span class="line">    <span class="attr">"expirationDate"</span>: <span class="number">1763471881</span>,</span><br><span class="line">    <span class="attr">"creationDate"</span>: <span class="number">1763470081</span></span><br><span class="line">  &#125;,</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="attr">"domain"</span>: <span class="string">".auth.mercari.com"</span>,</span><br><span class="line">    <span class="attr">"name"</span>: <span class="string">"userNonceKey"</span>,</span><br><span class="line">    <span class="attr">"value"</span>: <span class="string">"eyJhbGciOiJFUzI1NiIsImtpZCI6IjlvVE43bzI1WnNrWXVUNE1aU2g1U2oiLCJ0eXAiOiJKV1QifQ.eyJ2YWx1ZSI6IktCTkZVUDZ4cGlpM3hYQmswU1ZsTzdra3pCaDhOYkdpU0tWaFVnWmZHVGhuckUxV3NvTXdHdzhMYmNGTyJ9.gvNoX1GA5GGISjnZhvXiM6hcxmWkzc8OFJwNkYufI8u9xznhRmdCLI39opLi1cKg_ooDldP66h6Bhj3_oxG2iQ"</span>,</span><br><span class="line">    <span class="attr">"path"</span>: <span class="string">"/jp/v1"</span>,</span><br><span class="line">    <span class="attr">"secure"</span>: <span class="literal">true</span>,</span><br><span class="line">    <span class="attr">"httpOnly"</span>: <span class="literal">true</span>,</span><br><span class="line">    <span class="attr">"sameSite"</span>: <span class="string">"unspecified"</span>,</span><br><span class="line">    <span class="attr">"hostOnly"</span>: <span class="literal">false</span>,</span><br><span class="line">    <span class="attr">"storeId"</span>: <span class="string">"0"</span>,</span><br><span class="line">    <span class="attr">"session"</span>: <span class="literal">false</span>,</span><br><span class="line">    <span class="attr">"expirationDate"</span>: <span class="number">1763473554</span>,</span><br><span class="line">    <span class="attr">"creationDate"</span>: <span class="number">1763469954</span></span><br><span class="line">  &#125;,</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="attr">"domain"</span>: <span class="string">"login.jp.mercari.com"</span>,</span><br><span class="line">    <span class="attr">"name"</span>: <span class="string">"country_code"</span>,</span><br><span class="line">    <span class="attr">"value"</span>: <span class="string">"JP"</span>,</span><br><span class="line">    <span class="attr">"path"</span>: <span class="string">"/"</span>,</span><br><span class="line">    <span class="attr">"secure"</span>: <span class="literal">false</span>,</span><br><span class="line">    <span class="attr">"httpOnly"</span>: <span class="literal">false</span>,</span><br><span class="line">    <span class="attr">"sameSite"</span>: <span class="string">"unspecified"</span>,</span><br><span class="line">    <span class="attr">"hostOnly"</span>: <span class="literal">false</span>,</span><br><span class="line">    <span class="attr">"storeId"</span>: <span class="string">"0"</span>,</span><br><span class="line">    <span class="attr">"session"</span>: <span class="literal">false</span>,</span><br><span class="line">    <span class="attr">"expirationDate"</span>: <span class="number">1766061967</span>,</span><br><span class="line">    <span class="attr">"creationDate"</span>: <span class="number">1763469967</span></span><br><span class="line">  &#125;,</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="attr">"domain"</span>: <span class="string">"login.jp.mercari.com"</span>,</span><br><span class="line">    <span class="attr">"name"</span>: <span class="string">"version"</span>,</span><br><span class="line">    <span class="attr">"value"</span>: <span class="string">"main"</span>,</span><br><span class="line">    <span class="attr">"path"</span>: <span class="string">"/"</span>,</span><br><span class="line">    <span class="attr">"secure"</span>: <span class="literal">false</span>,</span><br><span class="line">    <span class="attr">"httpOnly"</span>: <span class="literal">false</span>,</span><br><span class="line">    <span class="attr">"sameSite"</span>: <span class="string">"unspecified"</span>,</span><br><span class="line">    <span class="attr">"hostOnly"</span>: <span class="literal">false</span>,</span><br><span class="line">    <span class="attr">"storeId"</span>: <span class="string">"0"</span>,</span><br><span class="line">    <span class="attr">"session"</span>: <span class="literal">false</span>,</span><br><span class="line">    <span class="attr">"expirationDate"</span>: <span class="number">1763477167</span>,</span><br><span class="line">    <span class="attr">"creationDate"</span>: <span class="number">1763469967</span></span><br><span class="line">  &#125;,</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="attr">"domain"</span>: <span class="string">"login.jp.mercari.com"</span>,</span><br><span class="line">    <span class="attr">"name"</span>: <span class="string">"_im_id.1019999"</span>,</span><br><span class="line">    <span class="attr">"value"</span>: <span class="string">"a7af53073829b27c.1763469962."</span>,</span><br><span class="line">    <span class="attr">"path"</span>: <span class="string">"/"</span>,</span><br><span class="line">    <span class="attr">"secure"</span>: <span class="literal">false</span>,</span><br><span class="line">    <span class="attr">"httpOnly"</span>: <span class="literal">false</span>,</span><br><span class="line">    <span class="attr">"sameSite"</span>: <span class="string">"unspecified"</span>,</span><br><span class="line">    <span class="attr">"hostOnly"</span>: <span class="literal">false</span>,</span><br><span class="line">    <span class="attr">"storeId"</span>: <span class="string">"0"</span>,</span><br><span class="line">    <span class="attr">"session"</span>: <span class="literal">false</span>,</span><br><span class="line">    <span class="attr">"expirationDate"</span>: <span class="number">1797425162</span>,</span><br><span class="line">    <span class="attr">"creationDate"</span>: <span class="number">1763469961</span></span><br><span class="line">  &#125;,</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="attr">"domain"</span>: <span class="string">"login.jp.mercari.com"</span>,</span><br><span class="line">    <span class="attr">"name"</span>: <span class="string">"_im_ses.1019999"</span>,</span><br><span class="line">    <span class="attr">"value"</span>: <span class="string">"1"</span>,</span><br><span class="line">    <span class="attr">"path"</span>: <span class="string">"/"</span>,</span><br><span class="line">    <span class="attr">"secure"</span>: <span class="literal">false</span>,</span><br><span class="line">    <span class="attr">"httpOnly"</span>: <span class="literal">false</span>,</span><br><span class="line">    <span class="attr">"sameSite"</span>: <span class="string">"unspecified"</span>,</span><br><span class="line">    <span class="attr">"hostOnly"</span>: <span class="literal">false</span>,</span><br><span class="line">    <span class="attr">"storeId"</span>: <span class="string">"0"</span>,</span><br><span class="line">    <span class="attr">"session"</span>: <span class="literal">false</span>,</span><br><span class="line">    <span class="attr">"expirationDate"</span>: <span class="number">1763471761</span>,</span><br><span class="line">    <span class="attr">"creationDate"</span>: <span class="number">1763469961</span></span><br><span class="line">  &#125;,</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="attr">"domain"</span>: <span class="string">"login.jp.mercari.com"</span>,</span><br><span class="line">    <span class="attr">"name"</span>: <span class="string">"launch_config"</span>,</span><br><span class="line">    <span class="attr">"value"</span>: <span class="string">"eyJkZXZpY2VUeXBlIjoiaW9zIiwidGhlbWUiOiJzeXN0ZW1fcHJlZmVyZW5jZSIsInVzZXJBZ2VudCI6Ik1lcmNhcmlfci8yMjc1NzYgKGlPUyAxOC4yOyBqYS1KUDsgaVBob25lMTIsNSkiLCJpdkNlcnQiOiI4MDY0MDk1NzY4Q0U0QTREQTU3QkJENzE2N0NDQ0NEMyIsImFwcFZlcnNpb24iOiIyMjc1NzYiLCJjbGllbnRVVUlEIjoiREQwRjYwMDUzNkJGNDhEMDlCOEVFMENFQTFEMzY5QTYiLCJjbGllbnRUeXBlIjoiZ3JvdW5kdXAifQ=="</span>,</span><br><span class="line">    <span class="attr">"path"</span>: <span class="string">"/"</span>,</span><br><span class="line">    <span class="attr">"secure"</span>: <span class="literal">false</span>,</span><br><span class="line">    <span class="attr">"httpOnly"</span>: <span class="literal">false</span>,</span><br><span class="line">    <span class="attr">"sameSite"</span>: <span class="string">"unspecified"</span>,</span><br><span class="line">    <span class="attr">"hostOnly"</span>: <span class="literal">false</span>,</span><br><span class="line">    <span class="attr">"storeId"</span>: <span class="string">"0"</span>,</span><br><span class="line">    <span class="attr">"session"</span>: <span class="literal">false</span>,</span><br><span class="line">    <span class="attr">"expirationDate"</span>: <span class="number">1763470266</span>,</span><br><span class="line">    <span class="attr">"creationDate"</span>: <span class="number">1763469966</span></span><br><span class="line">  &#125;,</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="attr">"domain"</span>: <span class="string">"login.jp.mercari.com"</span>,</span><br><span class="line">    <span class="attr">"name"</span>: <span class="string">"authUUID"</span>,</span><br><span class="line">    <span class="attr">"value"</span>: <span class="string">"f352e44c-87c5-4d63-aeb7-f3202877ca9f"</span>,</span><br><span class="line">    <span class="attr">"path"</span>: <span class="string">"/"</span>,</span><br><span class="line">    <span class="attr">"secure"</span>: <span class="literal">false</span>,</span><br><span class="line">    <span class="attr">"httpOnly"</span>: <span class="literal">false</span>,</span><br><span class="line">    <span class="attr">"sameSite"</span>: <span class="string">"unspecified"</span>,</span><br><span class="line">    <span class="attr">"hostOnly"</span>: <span class="literal">false</span>,</span><br><span class="line">    <span class="attr">"storeId"</span>: <span class="string">"0"</span>,</span><br><span class="line">    <span class="attr">"session"</span>: <span class="literal">false</span>,</span><br><span class="line">    <span class="attr">"expirationDate"</span>: <span class="number">1763471766</span>,</span><br><span class="line">    <span class="attr">"creationDate"</span>: <span class="number">1763469967</span></span><br><span class="line">  &#125;</span><br><span class="line">]</span><br></pre></td></tr></table></figure><h3 id="返回结果-4"><a href="#返回结果-4" class="headerlink" title="返回结果"></a>返回结果</h3><table><thead><tr><th>状态码</th><th>状态码含义</th><th>说明</th><th>数据模型</th></tr></thead><tbody><tr><td>200</td><td><a href="https://tools.ietf.org/html/rfc7231?f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE#section-6.3.1" rel="external nofollow noopener" referrerpolicy="unsafe-url" target="_blank">OK</a></td><td>none</td><td>Inline</td></tr></tbody></table><h3 id="返回数据结构-4"><a href="#返回数据结构-4" class="headerlink" title="返回数据结构"></a>返回数据结构</h3><p>状态码 <strong>200</strong></p><table><thead><tr><th>名称</th><th>类型</th><th>必选</th><th>约束</th><th>中文名</th><th>说明</th></tr></thead><tbody><tr><td>» domain</td><td>string</td><td>true</td><td>none</td><td>域名</td><td>none</td></tr><tr><td>» name</td><td>string</td><td>true</td><td>none</td><td>名称</td><td>none</td></tr><tr><td>» value</td><td>string</td><td>true</td><td>none</td><td>值</td><td>none</td></tr><tr><td>» path</td><td>string</td><td>true</td><td>none</td><td>路径</td><td>none</td></tr><tr><td>» secure</td><td>boolean</td><td>true</td><td>none</td><td></td><td>none</td></tr><tr><td>» httpOnly</td><td>boolean</td><td>true</td><td>none</td><td></td><td>none</td></tr><tr><td>» sameSite</td><td>string</td><td>true</td><td>none</td><td></td><td>none</td></tr><tr><td>» hostOnly</td><td>boolean</td><td>true</td><td>none</td><td></td><td>none</td></tr><tr><td>» storeId</td><td>string</td><td>true</td><td>none</td><td></td><td>none</td></tr><tr><td>» session</td><td>boolean</td><td>true</td><td>none</td><td></td><td>none</td></tr><tr><td>» expirationDate</td><td>integer</td><td>true</td><td>none</td><td></td><td>none</td></tr><tr><td>» creationDate</td><td>integer</td><td>true</td><td>none</td><td></td><td>none</td></tr></tbody></table><h2 id="GET-ip地址查询"><a href="#GET-ip地址查询" class="headerlink" title="GET ip地址查询"></a>GET ip地址查询</h2><p>GET <a href="https://open.kainy.cn/api/ip?f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" rel="external nofollow noopener" referrerpolicy="unsafe-url" target="_blank">https://open.kainy.cn/api/ip</a></p><p>根据IP查询归属地；</p><h3 id="请求参数-5"><a href="#请求参数-5" class="headerlink" title="请求参数"></a>请求参数</h3><table><thead><tr><th>名称</th><th>位置</th><th>类型</th><th>必选</th><th>说明</th></tr></thead><tbody><tr><td>ip</td><td>query</td><td>string</td><td>否</td><td>IP地址，留空则查询访问者IP</td></tr><tr><td>x-api-key</td><td>header</td><td>string</td><td>否</td><td>none</td></tr></tbody></table><blockquote><p>返回示例</p></blockquote><blockquote><p>200 Response</p></blockquote><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  <span class="attr">"location"</span>: <span class="string">"中国 广东省 深圳市"</span>,</span><br><span class="line">  <span class="attr">"ip"</span>: <span class="string">"58.250.29.186"</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="返回结果-5"><a href="#返回结果-5" class="headerlink" title="返回结果"></a>返回结果</h3><table><thead><tr><th>状态码</th><th>状态码含义</th><th>说明</th><th>数据模型</th></tr></thead><tbody><tr><td>200</td><td><a href="https://tools.ietf.org/html/rfc7231?f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE#section-6.3.1" rel="external nofollow noopener" referrerpolicy="unsafe-url" target="_blank">OK</a></td><td>none</td><td>Inline</td></tr></tbody></table><h3 id="返回数据结构-5"><a href="#返回数据结构-5" class="headerlink" title="返回数据结构"></a>返回数据结构</h3><p>状态码 <strong>200</strong></p><table><thead><tr><th>名称</th><th>类型</th><th>必选</th><th>约束</th><th>中文名</th><th>说明</th></tr></thead><tbody><tr><td>» location</td><td>string</td><td>true</td><td>none</td><td>位置</td><td>none</td></tr><tr><td>» ip</td><td>string</td><td>true</td><td>none</td><td>IP地址</td><td>none</td></tr></tbody></table><h2 id="GET-手机归属地查询"><a href="#GET-手机归属地查询" class="headerlink" title="GET 手机归属地查询"></a>GET 手机归属地查询</h2><p>GET <a href="https://open.kainy.cn/api/mobile?f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" rel="external nofollow noopener" referrerpolicy="unsafe-url" target="_blank">https://open.kainy.cn/api/mobile</a></p><p>根据手机号码查询归属地；</p><h3 id="请求参数-6"><a href="#请求参数-6" class="headerlink" title="请求参数"></a>请求参数</h3><table><thead><tr><th>名称</th><th>位置</th><th>类型</th><th>必选</th><th>说明</th></tr></thead><tbody><tr><td>phone</td><td>query</td><td>string</td><td>是</td><td>手机号码</td></tr><tr><td>x-api-key</td><td>header</td><td>string</td><td>是</td><td>none</td></tr></tbody></table><blockquote><p>返回示例</p></blockquote><blockquote><p>200 Response</p></blockquote><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  <span class="attr">"tel_address"</span>: <span class="string">"广东 广州 联通虚拟运营商"</span>,</span><br><span class="line">  <span class="attr">"province"</span>: <span class="string">"广东"</span>,</span><br><span class="line">  <span class="attr">"city"</span>: <span class="string">"广州"</span>,</span><br><span class="line">  <span class="attr">"sp"</span>: <span class="string">"联通虚拟运营商"</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="返回结果-6"><a href="#返回结果-6" class="headerlink" title="返回结果"></a>返回结果</h3><table><thead><tr><th>状态码</th><th>状态码含义</th><th>说明</th><th>数据模型</th></tr></thead><tbody><tr><td>200</td><td><a href="https://tools.ietf.org/html/rfc7231?f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE#section-6.3.1" rel="external nofollow noopener" referrerpolicy="unsafe-url" target="_blank">OK</a></td><td>none</td><td>Inline</td></tr></tbody></table><h3 id="返回数据结构-6"><a href="#返回数据结构-6" class="headerlink" title="返回数据结构"></a>返回数据结构</h3><p>状态码 <strong>200</strong></p><table><thead><tr><th>名称</th><th>类型</th><th>必选</th><th>约束</th><th>中文名</th><th>说明</th></tr></thead><tbody><tr><td>» tel_address</td><td>string</td><td>true</td><td>none</td><td>归属地</td><td>none</td></tr><tr><td>» province</td><td>string</td><td>true</td><td>none</td><td>省份</td><td>none</td></tr><tr><td>» city</td><td>string</td><td>true</td><td>none</td><td>城市</td><td>none</td></tr><tr><td>» sp</td><td>string</td><td>true</td><td>none</td><td>运营商</td><td>none</td></tr></tbody></table><h1 id="数据模型"><a href="#数据模型" class="headerlink" title="数据模型"></a>数据模型</h1>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;API key 获取地址：&lt;a href=&quot;https://open.kainy.cn/register/?f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE&quot; rel=&quot;external nofollow noopener&quot; referrerpolicy=&quot;unsafe-url&quot; target=&quot;_blank&quot;&gt;https://open.kainy.cn/register/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;GET-微信头像外链&quot;&gt;&lt;a href=&quot;#GET-微信头像外链&quot; class=&quot;headerlink&quot; title=&quot;GET 微信头像外链&quot;&gt;&lt;/a&gt;GET 微信头像外链&lt;/h2&gt;&lt;p&gt;GET &lt;a href=&quot;https://open.kainy.cn/api/wxAvatar?f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE&quot; rel=&quot;external nofollow noopener&quot; referrerpolicy=&quot;unsafe-url&quot; target=&quot;_blank&quot;&gt;https://open.kainy.cn/api/wxAvatar&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;微信禁止直接外链用户头像，通过此接口，可以绕过限制。&lt;/p&gt;
&lt;h3 id=&quot;请求参数&quot;&gt;&lt;a href=&quot;#请求参数&quot; class=&quot;headerlink&quot; title=&quot;请求参数&quot;&gt;&lt;/a&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;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;url&lt;/td&gt;
&lt;td&gt;query&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;是&lt;/td&gt;
&lt;td&gt;原始头像地址&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ak&lt;/td&gt;
&lt;td&gt;query&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;否&lt;/td&gt;
&lt;td&gt;api-key，可通过URL传递，如不填写，请通过header 的 x-api-key 传递。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;x-api-key&lt;/td&gt;
&lt;td&gt;header&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;否&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
    
    </summary>
    
      <category term="学习笔记" scheme="https://blogs.kainy.cn/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
      <category term="建站❤编程" scheme="https://blogs.kainy.cn/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E5%BB%BA%E7%AB%99%E2%9D%A4%E7%BC%96%E7%A8%8B/"/>
    
    
      <category term="小程序" scheme="https://blogs.kainy.cn/tags/%E5%B0%8F%E7%A8%8B%E5%BA%8F/"/>
    
      <category term="公众号" scheme="https://blogs.kainy.cn/tags/%E5%85%AC%E4%BC%97%E5%8F%B7/"/>
    
  </entry>
  
  <entry>
    <title>告别手动”分锅“，SonarQube扫描问题自动分配责任人</title>
    <link href="https://blogs.kainy.cn/2025/12/SonarQube%E6%89%AB%E6%8F%8F%E9%97%AE%E9%A2%98%E8%87%AA%E5%8A%A8%E5%88%86%E9%85%8D%E8%B4%A3%E4%BB%BB%E4%BA%BA/"/>
    <id>https://blogs.kainy.cn/2025/12/SonarQube扫描问题自动分配责任人/</id>
    <published>2025-12-22T22:20:17.000Z</published>
    <updated>2026-08-01T09:28:07.941Z</updated>
    
    <content type="html"><![CDATA[<h2 id="代码质量管理的“最后一公里”"><a href="#代码质量管理的“最后一公里”" class="headerlink" title="代码质量管理的“最后一公里”"></a>代码质量管理的“最后一公里”</h2><p>在日常的研发管理中，引入代码质量扫描（如 SonarQube）是保障工程质量的必要手段。然而，随着项目迭代和团队规模的扩大，我们经常面临一个痛点：</p><p><strong>扫描出来的问题成百上千，但不知道该谁修。</strong></p><p>作为管理者，如果每次扫描后都要人工去核对 Git 提交记录，然后手动将 Issue 指派给对应的开发人员，这无疑是巨大的工作量浪费。这种“保姆式”的管理不仅效率低下，而且容易出错。如果问题不能第一时间流转到“始作俑者”手中，技术债务就会像滚雪球一样越积越多，最终导致“破窗效应”。</p><a id="more"></a><p>为了解决这个问题，实现长治久安的代码质量管理，我们需要打通 <strong>CI/CD 工具与版本控制系统（SCM）</strong> 之间的任督二脉，实现<strong>问题的自动分配</strong>。</p><h2 id="核心痛点与解决方案"><a href="#核心痛点与解决方案" class="headerlink" title="核心痛点与解决方案"></a>核心痛点与解决方案</h2><ul><li><p><strong>现状：</strong> 代码扫描出 Bug/漏洞，状态为“未分配”。</p></li><li><p><strong>痛点：</strong> 管理员需要手动指派，不仅累，而且滞后。</p></li><li><p><strong>目标：</strong> 谁写的代码出了问题，系统自动挂在谁的名下。</p></li><li><p><strong>方案：</strong> 配置 SCM（Source Control Management）插件，利用 Git 的 Author 信息自动关联扫描平台的用户。</p></li></ul><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/2025/10/Pasted_image_20251021173819-1761559534432.png-1j8ii2suq.webp" alt></p><hr><h2 id="实操指南：三步实现自动归属"><a href="#实操指南：三步实现自动归属" class="headerlink" title="实操指南：三步实现自动归属"></a>实操指南：三步实现自动归属</h2><p>以下是在代码质量管理平台（以 SonarQube 为例）中的具体配置步骤。</p><h3 id="第一步：确保-SCM-功能已开启"><a href="#第一步：确保-SCM-功能已开启" class="headerlink" title="第一步：确保 SCM 功能已开启"></a>第一步：确保 SCM 功能已开启</h3><p>首先，我们需要确认系统能够读取项目的版本控制信息。</p><ol><li><p>以管理员身份登录。</p></li><li><p>进入 <strong>“配置” (Administration)</strong> -&gt; <strong>“SCM”</strong>。</p></li><li><p>检查并确认 SCM 传感器（Sensor）没有被禁用，且已安装 Git 等相关插件。</p></li></ol><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/2025/10/Pasted_image_20251021174044-1761559534427.png-1j8ii2t5h.webp" alt></p><h3 id="第二步：进入用户管理界面"><a href="#第二步：进入用户管理界面" class="headerlink" title="第二步：进入用户管理界面"></a>第二步：进入用户管理界面</h3><p>自动分配的核心逻辑是：<strong>扫描器读取代码每一行的 Git Blame 信息（邮箱或用户名） -&gt; 匹配平台内的用户账号 -&gt; 自动指派。</strong></p><p>因此，我们需要维护用户映射关系。</p><ol><li><p>点击顶部菜单的 <strong>“配置” (Administration)</strong>。</p></li><li><p>选择 <strong>“权限” (Security)</strong> -&gt; <strong>“用户” (Users)</strong>。</p></li></ol><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/2025/10/Pasted_image_20251021174930-1761559534420.png-1j8ii2qgt.webp" alt></p><h3 id="第三步：关联-SCM-账号（关键步骤）"><a href="#第三步：关联-SCM-账号（关键步骤）" class="headerlink" title="第三步：关联 SCM 账号（关键步骤）"></a>第三步：关联 SCM 账号（关键步骤）</h3><p>这是最关键的一步。很多时候自动分配失效，就是因为开发者在 Git 中配置的 Email/Name 与平台账号不一致。</p><ol><li><p>在用户列表中找到对应的开发人员。</p></li><li><p>点击最右侧的 <strong>“动作”</strong> 按钮（列表项末尾的设置图标）。</p></li><li><p>在弹出的菜单中选择 <strong>“更新详情” (Update Details)</strong>。</p></li><li><p>在弹窗中的 <strong>“SCM 账号” (SCM Accounts)</strong> 一栏中，输入开发者在提交 Git 代码时使用的 <strong>Email</strong> 或 <strong>Username</strong>。</p><ul><li><em>Tips：支持输入多个值，如果该开发者在不同仓库用了不同的邮箱，可以全部填入。</em></li></ul></li></ol><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/2025/10/Pasted_image_20251021174513-1761559534412.png-1j8ii2pak.webp" alt></p><p>完成这一步后，系统就建立起了 <strong>Git 提交者 <--> 平台用户</--></strong> 的映射关系。</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>配置完成后，下次执行流水线扫描时，新发现的代码异味（Code Smell）、漏洞（Vulnerability）或 Bug，将直接挂载到对应开发者的名下。</p><p>这带来的好处是显而易见的：</p><ol><li><p><strong>释放管理精力：</strong> 我不再需要充当“分发员”的角色。</p></li><li><p><strong>缩短反馈弧：</strong> 开发者能立刻收到通知（配合邮件或钉钉/企微插件），知道自己刚提交的代码有问题。</p></li><li><p><strong>责权清晰：</strong> 每一行代码都有据可查，培养团队“谁开发谁负责”的质量意识。</p></li></ol><p>技术管理者，要善用工具流程来解决重复性劳动，把时间花在更具价值的架构设计和团队建设上。</p>]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;代码质量管理的“最后一公里”&quot;&gt;&lt;a href=&quot;#代码质量管理的“最后一公里”&quot; class=&quot;headerlink&quot; title=&quot;代码质量管理的“最后一公里”&quot;&gt;&lt;/a&gt;代码质量管理的“最后一公里”&lt;/h2&gt;&lt;p&gt;在日常的研发管理中，引入代码质量扫描（如 SonarQube）是保障工程质量的必要手段。然而，随着项目迭代和团队规模的扩大，我们经常面临一个痛点：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;扫描出来的问题成百上千，但不知道该谁修。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;作为管理者，如果每次扫描后都要人工去核对 Git 提交记录，然后手动将 Issue 指派给对应的开发人员，这无疑是巨大的工作量浪费。这种“保姆式”的管理不仅效率低下，而且容易出错。如果问题不能第一时间流转到“始作俑者”手中，技术债务就会像滚雪球一样越积越多，最终导致“破窗效应”。&lt;/p&gt;
    
    </summary>
    
      <category term="学习笔记" scheme="https://blogs.kainy.cn/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
      <category term="建站❤编程" scheme="https://blogs.kainy.cn/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E5%BB%BA%E7%AB%99%E2%9D%A4%E7%BC%96%E7%A8%8B/"/>
    
    
      <category term="团队效能" scheme="https://blogs.kainy.cn/tags/%E5%9B%A2%E9%98%9F%E6%95%88%E8%83%BD/"/>
    
      <category term="DevOps" scheme="https://blogs.kainy.cn/tags/DevOps/"/>
    
  </entry>
  
  <entry>
    <title>SyncMein 侵权行为投诉渠道及政策说明</title>
    <link href="https://blogs.kainy.cn/2025/11/SyncMein%20%E4%BE%B5%E6%9D%83%E8%A1%8C%E4%B8%BA%E6%8A%95%E8%AF%89%E6%B8%A0%E9%81%93%E5%8F%8A%E6%94%BF%E7%AD%96%E8%AF%B4%E6%98%8E/"/>
    <id>https://blogs.kainy.cn/2025/11/SyncMein 侵权行为投诉渠道及政策说明/</id>
    <published>2025-11-12T12:46:17.000Z</published>
    <updated>2026-08-01T09:28:07.941Z</updated>
    
    <content type="html"><![CDATA[<p><strong>致 SyncMein 用户及各内容平台方：</strong></p><p><a href="https://kainy.cn/SyncMeIn/#blogs" target="_blank" rel="noopener">SyncMein 插件</a>（以下简称“本插件”）的设计初衷，是为了解决个人用户在合法持有多个设备时，同步个人账号登录状态的不便，提升用户在自有设备间切换的体验。</p><p>我们尊重所有创作者的劳动成果、合法权益，并致力于维护内容平台的正常经营秩序。</p><p><strong>一、 严正声明</strong></p><p>近期，我们监测到有部分用户滥用本插件，将其用于“付费共享会员账号”等商业盈利活动。此行为严重违反了 SyncMein 的服务协议，不仅侵害了本插件的权益，更对相关内容平台及内容创作者的合法权益造成了严重损害。</p><p>我们在此严正声明：<strong>SyncMein 坚决反对将本插件用于包括（但不限于）付费共享会员账号、账号租赁在内的一切商业目的。</strong></p><a id="more"></a><p><strong>二、 违规处理措施</strong></p><p>为遏制侵权行为，我们将采取以下措施：</p><ol><li><p><strong>账号封禁：</strong> 对于任何违反 SyncMein 使用协议、利用本工具非法获利或侵犯他人权益的账号，一经核实，我们将立即予以<strong>永久封禁</strong>处理。</p></li><li><p><strong>建立“禁用域名名单”：</strong> 我们已建立并动态维护一个“禁用域名名单”。本插件将禁止为名单内的所有域名生成和同步登录口令，从源头上阻止相关平台的账号共享。</p></li></ol><p><strong>三、 侵权举报渠道</strong></p><p>我们在此设立官方侵权行为举报渠道。如果您是个人用户、内容创作者或平台方，发现任何个人或组织借助 SyncMein 实施侵权行为，请通过以下方式联系我们，并提供相关证明。</p><p><strong>1. 举报需要提供的材料：</strong></p><ul><li><p>侵权行为的详细描述。</p></li><li><p>可证明侵权行为的证据（例如：销售页面截图、付款记录、聊天记录、公开宣传链接等）。</p></li></ul><p><strong>2. 举报处理流程：</strong></p><ol><li><p><strong>提交举报：</strong> 请将上述材料发送至我们的官方举报邮箱：<strong>[<a href="mailto:smi-jubao@gqmg.com?f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" rel="external nofollow noopener" referrerpolicy="unsafe-url" target="_blank">smi-jubao@gqmg.com</a>]</strong></p></li><li><p><strong>内部核实：</strong> 我们在收到举报后，将进行深入核实。</p></li><li><p><strong>执行处理：</strong> 举报内容一经查实，我们将立即采取行动（包括但不限于封禁相关 SyncMein 账号、拉黑设备特征码等）。</p></li></ol><p><strong>3. 如何申请将域名加入“禁用域名名单”：</strong></p><p>如果您是<strong>内容平台方</strong>或<strong>域名所有者</strong>，并希望将您的域名加入“禁用域名名单”，以保护贵平台的权益：</p><ul><li><p>请您务必使用<strong>与申请域名相同的邮箱后缀</strong>（例如：使用 <a href="mailto:%60security@yourdomain.com?f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" rel="external nofollow noopener" referrerpolicy="unsafe-url" target="_blank">`security@yourdomain.com</a><code>邮箱申请</code>yourdomain.com`）发送申请。</p></li><li><p>或使用<strong>公开渠道可查证域名归属的邮箱</strong>（例如：域名 Whois 信息中的联系邮箱）发送申请。</p></li><li><p><strong>申请邮箱：</strong> <strong>[<a href="mailto:smi-block@gqmg.com?f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" rel="external nofollow noopener" referrerpolicy="unsafe-url" target="_blank">smi-block@gqmg.com</a>]</strong></p></li></ul><p>我们对所有遵守协议、合理使用工具的用户表示感谢，也对因侵权行为受到损害的平台方表示歉意。SyncMein 团队将持续投入资源，打击黑产，维护健康的网络环境。</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;strong&gt;致 SyncMein 用户及各内容平台方：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://kainy.cn/SyncMeIn/#blogs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;SyncMein 插件&lt;/a&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;近期，我们监测到有部分用户滥用本插件，将其用于“付费共享会员账号”等商业盈利活动。此行为严重违反了 SyncMein 的服务协议，不仅侵害了本插件的权益，更对相关内容平台及内容创作者的合法权益造成了严重损害。&lt;/p&gt;
&lt;p&gt;我们在此严正声明：&lt;strong&gt;SyncMein 坚决反对将本插件用于包括（但不限于）付费共享会员账号、账号租赁在内的一切商业目的。&lt;/strong&gt;&lt;/p&gt;
    
    </summary>
    
      <category term="SyncMein" scheme="https://blogs.kainy.cn/categories/SyncMein/"/>
    
      <category term="SyncMein教程" scheme="https://blogs.kainy.cn/categories/SyncMein/SyncMein%E6%95%99%E7%A8%8B/"/>
    
    
      <category term="SyncMein" scheme="https://blogs.kainy.cn/tags/SyncMein/"/>
    
  </entry>
  
  <entry>
    <title>为了分享自己做的 MCP，我最后做了一个网站…</title>
    <link href="https://blogs.kainy.cn/2025/07/%E4%B8%BA%E4%BA%86%E5%88%86%E4%BA%AB%E8%87%AA%E5%B7%B1%E5%81%9A%E7%9A%84%20MCP%EF%BC%8C%E6%88%91%E6%9C%80%E5%90%8E%E5%81%9A%E4%BA%86%E4%B8%80%E4%B8%AA%E7%BD%91%E7%AB%99%E2%80%A6/"/>
    <id>https://blogs.kainy.cn/2025/07/为了分享自己做的 MCP，我最后做了一个网站…/</id>
    <published>2025-07-31T04:23:04.000Z</published>
    <updated>2026-08-01T09:28:07.945Z</updated>
    
    <content type="html"><![CDATA[<p>最初只想做一个 MCP server 练练手，验证 MCP 能力边界，结果却一步步把 coze 、混元智能体都摸个底朝天，最终把功能做了一个网站。。</p><p>背景是马上国庆了，想用智能体帮我规划一下旅游路线。路线规划最耗费时间精力的就是酒店，我打算用 mcp 来解决这个痛点。</p><p>从数据入手，先写了一个优惠酒店信息爬虫，爬取携程上面支持“未订可退、过期自动退”的优惠酒店。选择携程是因为大平台，产品相对可靠也比较有保障。而过期退则可以很好的应对行程变化的突发情况。</p><a id="more"></a><p>有了数据，再写一个 API，然后套上 mcp 协议，就算完事了。</p><p>放在 ChatBot 里，很快就 work 了</p><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2025/07/mdptuuq4.png" alt></p><p>但这只是开始，想要分享 MCP server 给被人用，还需要发布到 coze 和混元这样的平台。</p><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2025/07/mdpua6i2.png" alt></p><p>这是 coze 生成的结果，虽然按照要求的产品卡片格式排版，但是忽略了图片元素渲染，导致图片位置看起来特奇怪。好在预定链接可以点击，正确跳转。</p><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2025/07/mdpv2vyh.png" alt></p><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2025/07/mdpufzrw.png" alt></p><p>而混元的情况则比较糟糕，完全没理会产品卡片格式要求，图片和产品链接都是虚拟的。。完全没用。</p><p>本来 MCP 就的意义就在于打通大模型和真实数据壁垒，结果大平台处于信息安全的考量，粗暴地把有用的数据都隐蔽，“娃娃跟洗澡水一起倒“了。</p><p>看来短期内，真正的开放还很难做到。</p><p>基于此，也只好另想办法。</p><p>自己的网站总归不受限吧？</p><p>好在有了 AI 辅助编程，制作一个网站不像往常那样费劲。</p><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2025/07/mdpusot6.png" alt></p><p>这是最终效果，不仅排版美观了，有了更强的大模型支持，内容也丰富许多。</p><p>目前用的是我自用同款大模型，等调用量上来恐怕扛不住，再换回普通版。</p><p>嗯，这才是最初构思中，旅游路线规划应用应该有的样子。</p><p>还有优化空间，后面慢慢整活吧。</p><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2025/07/mdq04dlq.jpg" alt="从左到右依次是：1、计划生成页；2、行程信息录入；3、计划生成进度；4、生成结果展示"></p><p>从左到右依次是：1、计划生成页；2、行程信息录入；3、计划生成进度；4、生成结果展示</p><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2025/07/mdq04ock.jpg" alt="从左到右依次是：1、首页；2城市列表页；3、旅程列表页；4、旅程详情页"></p><p>从左到右依次是：1、首页；2城市列表页；3、旅程列表页；4、旅程详情页</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;最初只想做一个 MCP server 练练手，验证 MCP 能力边界，结果却一步步把 coze 、混元智能体都摸个底朝天，最终把功能做了一个网站。。&lt;/p&gt;
&lt;p&gt;背景是马上国庆了，想用智能体帮我规划一下旅游路线。路线规划最耗费时间精力的就是酒店，我打算用 mcp 来解决这个痛点。&lt;/p&gt;
&lt;p&gt;从数据入手，先写了一个优惠酒店信息爬虫，爬取携程上面支持“未订可退、过期自动退”的优惠酒店。选择携程是因为大平台，产品相对可靠也比较有保障。而过期退则可以很好的应对行程变化的突发情况。&lt;/p&gt;
    
    </summary>
    
      <category term="学习笔记" scheme="https://blogs.kainy.cn/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
      <category term="建站❤编程" scheme="https://blogs.kainy.cn/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E5%BB%BA%E7%AB%99%E2%9D%A4%E7%BC%96%E7%A8%8B/"/>
    
    
      <category term="MCP" scheme="https://blogs.kainy.cn/tags/MCP/"/>
    
      <category term="旅游" scheme="https://blogs.kainy.cn/tags/%E6%97%85%E6%B8%B8/"/>
    
      <category term="网站" scheme="https://blogs.kainy.cn/tags/%E7%BD%91%E7%AB%99/"/>
    
  </entry>
  
  <entry>
    <title>请3休12，2025国庆提前冲！附20+国内精选路线，绝美秋色、登山看海！</title>
    <link href="https://blogs.kainy.cn/2025/07/%E8%AF%B73%E4%BC%9112%EF%BC%8C%E5%9B%BD%E5%BA%86%E6%8F%90%E5%89%8D%E5%86%B2%EF%BC%8120+%E5%9B%BD%E5%86%85%E7%B2%BE%E9%80%89%E8%B7%AF%E7%BA%BF%EF%BC%8C%E7%BB%9D%E7%BE%8E%E7%A7%8B%E8%89%B2%E3%80%81%E7%99%BB%E5%B1%B1%E7%9C%8B%E6%B5%B7%EF%BC%81/"/>
    <id>https://blogs.kainy.cn/2025/07/请3休12，国庆提前冲！20+国内精选路线，绝美秋色、登山看海！/</id>
    <published>2025-07-29T15:23:04.000Z</published>
    <updated>2026-08-01T09:28:07.965Z</updated>
    
    <content type="html"><![CDATA[<style>.posts-expand .post-body img {      border: none !important;    }</style><section style="box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);">  <section style="max-width: 100%;margin-left: 8px;margin-right: 8px;box-sizing: border-box;">    <section style="line-height: 0;text-align: center;max-width: 100%;box-sizing: border-box;">      <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_gif/LicckDpL06qkHNpzchicibUA2DtkdpVjyzV9Xp98iaIQOYm0z3srJOxIM7GUmJQy8LNwTJ1BgWeL7iatmNPicXicQic15Q/640?wx_fmt=gif&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>    </section>  </section>  <section style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;">    <section style="display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;">      <section style="text-align: justify;font-family: PingFangSC-light;font-size: 14px;box-sizing: border-box;">        <p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>七月中旬，是谁坐在工位默默羡慕</span></p>        <p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>小孩哥/姐趁着暑假出门看世界？</span></p>        <p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>🥵🥵🥵</span><span><br class="ProseMirror-trailingBreak"></span></p>        <p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>        <p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>7&amp;8&amp;9三个月的</span><span style="color: rgb(255, 188, 0);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span>假</span><span style="font-style: normal;justify-content: flex-start;flex-flow: row;vertical-align: top;align-self: flex-start;flex: 0 0 auto;font-family: PingFangSC-light;font-size: 14px;text-align: center;color: rgb(255, 188, 0);font-weight: bold;box-sizing: border-box;">期空窗</span></strong></span></p>        <p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>日子显得尤为漫长</span></p>        <p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span style="background-color: rgb(255, 188, 0);color: rgb(255, 255, 255);font-size: 16px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span>&nbsp;翘首期盼国庆！！&nbsp;</span></strong></span></p>        <p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>&nbsp;想想那时被秋意覆盖的景色，就蠢蠢欲动</span></p>        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>      </section>      <a id="more"></a>      <section style="text-align: center;margin: 0px 0px 10px;line-height: 0;box-sizing: border-box;">        <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_jpg/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVBsXC2o8tZ4y9zHPejIrYJ1NEpNXqC7c3TBIxLp6RgWO1RaA65LcVHQ/640?wx_fmt=jpeg&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align:middle;max-width:100%;width:100%;box-sizing:border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>      </section>      <section style="margin: 0px;box-sizing: border-box;">        <section style="text-align: justify;font-size: 12px;color: rgb(160, 160, 160);font-family: PingFangSC-light;box-sizing: border-box;">          <p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>坝上秋色@蛮牛</span></p>        </section>      </section>      <section style="text-align: justify;font-family: PingFangSC-light;font-size: 14px;box-sizing: border-box;">        <p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>        <p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>作为2025年</span><span style="font-style: normal;justify-content: flex-start;flex-flow: row;vertical-align: top;align-self: flex-start;flex: 0 0 auto;font-family: PingFangSC-light;font-size: 14px;text-align: center;color: rgb(255, 188, 0);font-weight: bold;box-sizing: border-box;">最后一个黄金假</span></p>        <p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>还是和中秋连着放，</span><span style="font-style: normal;justify-content: flex-start;flex-flow: row;vertical-align: top;align-self: flex-start;flex: 0 0 auto;font-family: PingFangSC-light;font-size: 14px;text-align: center;color: rgb(255, 188, 0);font-weight: bold;box-sizing: border-box;">一共8天</span></p>        <p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>你想好怎么度过了吗？</span></p>        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>      </section>      <section style="text-align: center;margin: 0px 0px 10px;line-height: 0;box-sizing: border-box;">        <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_jpg/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVuVibcyudMg7g1PKA2qsibu2ib8BforZVLbzjO3a58mzLknAo0wDKtlNrw/640?wx_fmt=jpeg&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align:middle;max-width:100%;width:100%;box-sizing:border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>      </section>      <section style="margin: 0px;box-sizing: border-box;">        <section style="text-align: justify;font-size: 12px;color: rgb(160, 160, 160);font-family: PingFangSC-light;box-sizing: border-box;">          <p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>太行 @可航</span></p>        </section>      </section>      <section style="text-align: center;font-family: PingFangSC-light;font-size: 14px;box-sizing: border-box;">        <p style="margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>        <p style="margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>虽然距离十一假期还有两个多月</span></p>        <p style="margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>但现在筹划国庆出游一点都不早！</span></p>        <p style="margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>如果考虑多请3天假</span></p>        <p style="margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>甚至可以喜提</span><span style="font-size: 16px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span style="color: rgb(255, 188, 0);box-sizing: border-box;"><span>12天超长假期</span></span></strong></span><span>！</span></p>        <p style="margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>简直赚翻了，年假就该这么用！</span></p>      </section>      <section style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;">        <section style="text-align: center;line-height: 2em;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_jpg/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVwCq1kt1GV2Iw4cuI6Aw3l59moibGUB40kibIecv0Pk9Llwt4mhcRKAoA/640?wx_fmt=jpeg" class="rich_pages wxw-img js_insertlocalimg" style="width: 479px;height: 115px;" type="block" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>      </section>      <section style="margin: 0px;box-sizing: border-box;">        <section style="text-align: justify;font-size: 12px;color: rgb(160, 160, 160);font-family: PingFangSC-light;box-sizing: border-box;">          <p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><span textstyle style="font-weight: bold">*只需要请9月28/29/30日 or 10月9/10/11日</span></span></p>          <p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><span textstyle style="font-weight: bold">即可拼出12天惊喜好假😍</span></span></p>        </section>      </section>      <section style="text-align: justify;font-family: PingFangSC-light;font-size: 14px;box-sizing: border-box;">        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>        <p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>这不！小侠也先行一步💃🏻</span></p>        <p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>准备了适合国庆出发的国内长线</span></p>        <p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>绝大部分都是</span><span style="font-style: normal;justify-content: flex-start;flex-flow: row;vertical-align: top;align-self: flex-start;flex: 0 0 auto;text-align: center;font-family: PingFangSC-light;font-size: 16px;font-weight: bold;color: rgb(255, 188, 0);box-sizing: border-box;">4-7日</span><span>路线</span></p>        <p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>不请假闭眼冲</span></p>        <p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><span textstyle style="font-weight: bold">✅</span></span><span><span textstyle style="font-weight: bold">多条</span></span><span><span textstyle style="font-weight: bold">已成行 ✅多地高铁直达</span></span></p>        <p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>        <p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>👇🏻</span></p>        <p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span style="color: rgb(255, 188, 0);font-size: 16px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span><span textstyle style="text-decoration: underline">自然 / 人文 / 秋色 / 亲子 / 户外</span></span></strong></span></p>        <p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>        <p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>经典爆款和小众宝藏，这里都有🌟</span></p>        <p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>不想错过心仪路线，可以尽早上车哦~</span></p>        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>      </section>    </section>  </section>  <section style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;">    <section style="display: inline-block;vertical-align: top;width: auto;align-self: flex-start;flex: 0 0 auto;line-height: 0;min-width: 5%;max-width: 100%;height: auto;margin: 0px;z-index: 1;padding: 0px;box-sizing: border-box;">      <section style="margin: 3px 0px 0px;box-sizing: border-box;">        <section style="display: inline-block;width: 18px;height: 18px;vertical-align: top;overflow: hidden;border-radius: 252px;background-color: rgb(242, 90, 138);box-sizing: border-box;">          <section style="color: rgb(255, 255, 255);line-height: 1.6;font-size: 12px;box-sizing: border-box;">            <p style="margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><span textstyle style="font-weight: bold">1</span></span></p>          </section>        </section>      </section>      <section style="display: flex;width: 100%;flex-flow: column;box-sizing: border-box;">        <section style="z-index: 1;box-sizing: border-box;">          <section style="display: inline-block;width: 3px;height: 6px;vertical-align: top;overflow: hidden;background-color: rgb(185, 196, 200);box-sizing: border-box;">            <section style="text-align: justify;box-sizing: border-box;">              <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>            </section>          </section>        </section>      </section>      <section style="margin: -3px 0px 0px;box-sizing: border-box;">        <section style="display: inline-block;width: 13px;height: 6px;vertical-align: top;overflow: hidden;border-radius: 99%;background-color: rgb(87, 87, 87);box-sizing: border-box;">          <section style="text-align: justify;box-sizing: border-box;">            <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>          </section>        </section>      </section>    </section>    <section style="display: inline-block;vertical-align: top;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;padding: 0px 0px 0px 7px;align-self: flex-start;box-sizing: border-box;">      <section style="text-align: justify;color: rgb(255, 188, 0);font-family: PingFangSC-light;box-sizing: border-box;">        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><b style="box-sizing: border-box;"><span>景德镇出发</span></b></p>      </section>      <section style="transform: perspective(0px);-webkit-transform: perspective(0px);-moz-transform: perspective(0px);-o-transform: perspective(0px);transform-style: flat;box-sizing: border-box;">        <section style="text-align: right;margin: 0px;line-height: 0;transform: rotateX(180deg) rotateY(180deg);-webkit-transform: rotateX(180deg) rotateY(180deg);-moz-transform: rotateX(180deg) rotateY(180deg);-o-transform: rotateX(180deg) rotateY(180deg);box-sizing: border-box;">          <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;width: 78px;height: auto;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_png/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVI6dOQkwHER7jCbZUyBeB7wKx5yfTiaoUoJw944TfGsnnFY7TciaCOBCA/640?wx_fmt=png&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>        </section>      </section>    </section>  </section>  <section style="font-size: 14px;font-family: PingFangSC-light;box-sizing: border-box;">    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><span textstyle style="font-size: 15px">👉🏻</span><a class="weapp_text_link js_weapp_entry" href="https://hotel.gqmg.com/p?startPoint=%E6%99%AF%E5%BE%B7%E9%95%87&f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" target="_blank" rel="external nofollow noopener" referrerpolicy="unsafe-url"><span textstyle style="font-size: 15px">【江西·徽风瓷韵】</span></a><span textstyle style="font-size: 15px">&nbsp;</span></span></p>    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><span textstyle style="font-size: 15px">📆4天3晚</span></span></p>    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>景德镇-婺源篁岭-婺女洲，饱览风光，访古窑逛烟火集市，感受盛世徽州。</span></p>  </section>  <section style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;">    <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_jpg/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVRsqFtTr4HQNibxmtI6jibt84LFkGqbAnKbZcnnYs8ekb9VbmFPYUIu5A/640?wx_fmt=jpeg&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align:middle;max-width:100%;width:100%;box-sizing:border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>  </section>  <section style="font-size: 12px;box-sizing: border-box;">    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>  </section>  <section style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;">    <section style="display: inline-block;vertical-align: top;width: auto;align-self: flex-start;flex: 0 0 auto;line-height: 0;min-width: 5%;max-width: 100%;height: auto;margin: 0px;z-index: 1;padding: 0px;box-sizing: border-box;">      <section style="margin: 3px 0px 0px;box-sizing: border-box;">        <section style="display: inline-block;width: 18px;height: 18px;vertical-align: top;overflow: hidden;border-radius: 252px;background-color: rgb(242, 90, 138);box-sizing: border-box;">          <section style="color: rgb(255, 255, 255);line-height: 1.6;font-size: 12px;box-sizing: border-box;">            <p style="margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><span textstyle style="font-weight: bold">2</span></span></p>          </section>        </section>      </section>      <section style="display: flex;width: 100%;flex-flow: column;box-sizing: border-box;">        <section style="z-index: 1;box-sizing: border-box;">          <section style="display: inline-block;width: 3px;height: 6px;vertical-align: top;overflow: hidden;background-color: rgb(185, 196, 200);box-sizing: border-box;">            <section style="text-align: justify;box-sizing: border-box;">              <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>            </section>          </section>        </section>      </section>      <section style="margin: -3px 0px 0px;box-sizing: border-box;">        <section style="display: inline-block;width: 13px;height: 6px;vertical-align: top;overflow: hidden;border-radius: 99%;background-color: rgb(87, 87, 87);box-sizing: border-box;">          <section style="text-align: justify;box-sizing: border-box;">            <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>          </section>        </section>      </section>    </section>    <section style="display: inline-block;vertical-align: top;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;padding: 0px 0px 0px 7px;align-self: flex-start;box-sizing: border-box;">      <section style="text-align: justify;color: rgb(255, 188, 0);font-family: PingFangSC-light;box-sizing: border-box;">        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><b style="box-sizing: border-box;"><span>武夷山出发</span></b></p>      </section>      <section style="transform: perspective(0px);-webkit-transform: perspective(0px);-moz-transform: perspective(0px);-o-transform: perspective(0px);transform-style: flat;box-sizing: border-box;">        <section style="text-align: right;margin: 0px;line-height: 0;transform: rotateX(180deg) rotateY(180deg);-webkit-transform: rotateX(180deg) rotateY(180deg);-moz-transform: rotateX(180deg) rotateY(180deg);-o-transform: rotateX(180deg) rotateY(180deg);box-sizing: border-box;">          <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;width: 78px;height: auto;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_png/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVI6dOQkwHER7jCbZUyBeB7wKx5yfTiaoUoJw944TfGsnnFY7TciaCOBCA/640?wx_fmt=png&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>        </section>      </section>    </section>  </section>  <section style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;">    <section style="display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;">      <section style="text-align: justify;font-family: PingFangSC-light;box-sizing: border-box;">        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span style="font-size: 14px;box-sizing: border-box;"><span>👉🏻<a class="weapp_text_link js_weapp_entry" href="https://hotel.gqmg.com/p?startPoint=%E6%AD%A6%E5%A4%B7%E5%B1%B1&f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" target="_blank" rel="external nofollow noopener" referrerpolicy="unsafe-url"><span textstyle style="font-size: 15px">【轻户外·丈量武夷】</span></a></span></span></p>        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span style="font-size: 14px;box-sizing: border-box;"><span><span textstyle style="font-size: 15px">📆4天3晚</span></span></span></p>        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span style="font-size: 14px;box-sizing: border-box;"><span>秋韵武夷山，误入云雾缭绕的仙境。在轻徒步中收集五彩秋色，登顶白云岩独家视角览九曲溪全貌。</span></span></p>      </section>      <section style="text-align: center;margin: 10px 0px 0px;line-height: 0;box-sizing: border-box;">        <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_jpg/LicckDpL06qkHNpzchicibUA2DtkdpVjyzV0sia5s0OY1Z94IcVNlYUd1FDjgzb0Ej5Q4LIwSIj1IibcjqMU7Gq4yRg/640?wx_fmt=jpeg&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align:middle;max-width:100%;width:100%;box-sizing:border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>      </section>      <section style="text-align: justify;font-family: PingFangSC-light;box-sizing: border-box;">        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>      </section>    </section>  </section>  <section style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;">    <section style="display: inline-block;vertical-align: top;width: auto;align-self: flex-start;flex: 0 0 auto;line-height: 0;min-width: 5%;max-width: 100%;height: auto;margin: 0px;z-index: 1;padding: 0px;box-sizing: border-box;">      <section style="margin: 3px 0px 0px;box-sizing: border-box;">        <section style="display: inline-block;width: 18px;height: 18px;vertical-align: top;overflow: hidden;border-radius: 252px;background-color: rgb(242, 90, 138);box-sizing: border-box;">          <section style="color: rgb(255, 255, 255);line-height: 1.6;font-size: 12px;box-sizing: border-box;">            <p style="margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><span textstyle style="font-weight: bold">3</span></span></p>          </section>        </section>      </section>      <section style="display: flex;width: 100%;flex-flow: column;box-sizing: border-box;">        <section style="z-index: 1;box-sizing: border-box;">          <section style="display: inline-block;width: 3px;height: 6px;vertical-align: top;overflow: hidden;background-color: rgb(185, 196, 200);box-sizing: border-box;">            <section style="text-align: justify;box-sizing: border-box;">              <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>            </section>          </section>        </section>      </section>      <section style="margin: -3px 0px 0px;box-sizing: border-box;">        <section style="display: inline-block;width: 13px;height: 6px;vertical-align: top;overflow: hidden;border-radius: 99%;background-color: rgb(87, 87, 87);box-sizing: border-box;">          <section style="text-align: justify;box-sizing: border-box;">            <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>          </section>        </section>      </section>    </section>    <section style="display: inline-block;vertical-align: top;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;padding: 0px 0px 0px 7px;align-self: flex-start;box-sizing: border-box;">      <section style="text-align: justify;color: rgb(255, 188, 0);font-family: PingFangSC-light;box-sizing: border-box;">        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><strong style="box-sizing: border-box;"><span>霞浦出发</span></strong></p>      </section>      <section style="transform: perspective(0px);-webkit-transform: perspective(0px);-moz-transform: perspective(0px);-o-transform: perspective(0px);transform-style: flat;box-sizing: border-box;">        <section style="text-align: right;margin: 0px;line-height: 0;transform: rotateX(180deg) rotateY(180deg);-webkit-transform: rotateX(180deg) rotateY(180deg);-moz-transform: rotateX(180deg) rotateY(180deg);-o-transform: rotateX(180deg) rotateY(180deg);box-sizing: border-box;">          <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;width: 78px;height: auto;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_png/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVI6dOQkwHER7jCbZUyBeB7wKx5yfTiaoUoJw944TfGsnnFY7TciaCOBCA/640?wx_fmt=png&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>        </section>      </section>    </section>  </section>  <section style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;">    <section style="display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;">      <section style="font-size: 14px;text-align: justify;font-family: PingFangSC-light;box-sizing: border-box;">        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span style="box-sizing: border-box;"><span>👉🏻</span></span><span><a class="weapp_text_link js_weapp_entry" href="https://hotel.gqmg.com/p?startPoint=%E5%8E%A6%E9%97%A8&f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" target="_blank" rel="external nofollow noopener" referrerpolicy="unsafe-url"><span textstyle style="font-size: 15px">【四礵列岛】</span></a></span></p>        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span style="font-size: 14px;box-sizing: border-box;"><span><span textstyle style="font-size: 15px">📆5天4晚</span></span></span></p>        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>福建海岛天花板！一次看遍果冻海、断崖、草地、海鸟、沙滩、日落，海岸徒步现实版塞尔达，夜宿小冰岛浮鹰岛。</span></p>      </section>      <section style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;">        <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_jpg/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVfLjmLTa57RZy3UzFHFhCoMkFOBMlcKzk7oV6icMg8GvGOmntPXf1reQ/640?wx_fmt=jpeg&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align:middle;max-width:100%;width:100%;box-sizing:border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>      </section>      <section style="font-size: 12px;text-align: justify;box-sizing: border-box;">        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>      </section>    </section>  </section>  <section style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;">    <section style="display: inline-block;vertical-align: top;width: auto;align-self: flex-start;flex: 0 0 auto;line-height: 0;min-width: 5%;max-width: 100%;height: auto;margin: 0px;z-index: 1;padding: 0px;box-sizing: border-box;">      <section style="margin: 3px 0px 0px;box-sizing: border-box;">        <section style="display: inline-block;width: 18px;height: 18px;vertical-align: top;overflow: hidden;border-radius: 252px;background-color: rgb(242, 90, 138);box-sizing: border-box;">          <section style="color: rgb(255, 255, 255);line-height: 1.6;font-size: 12px;box-sizing: border-box;">            <p style="margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><span textstyle style="font-weight: bold">4</span></span></p>          </section>        </section>      </section>      <section style="display: flex;width: 100%;flex-flow: column;box-sizing: border-box;">        <section style="z-index: 1;box-sizing: border-box;">          <section style="display: inline-block;width: 3px;height: 6px;vertical-align: top;overflow: hidden;background-color: rgb(185, 196, 200);box-sizing: border-box;">            <section style="text-align: justify;box-sizing: border-box;">              <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>            </section>          </section>        </section>      </section>      <section style="margin: -3px 0px 0px;box-sizing: border-box;">        <section style="display: inline-block;width: 13px;height: 6px;vertical-align: top;overflow: hidden;border-radius: 99%;background-color: rgb(87, 87, 87);box-sizing: border-box;">          <section style="text-align: justify;box-sizing: border-box;">            <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>          </section>        </section>      </section>    </section>    <section style="display: inline-block;vertical-align: top;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;padding: 0px 0px 0px 7px;align-self: flex-start;box-sizing: border-box;">      <section style="text-align: justify;color: rgb(255, 188, 0);font-family: PingFangSC-light;box-sizing: border-box;">        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><b style="box-sizing: border-box;"><span>北京出发</span></b></p>      </section>      <section style="transform: perspective(0px);-webkit-transform: perspective(0px);-moz-transform: perspective(0px);-o-transform: perspective(0px);transform-style: flat;box-sizing: border-box;">        <section style="text-align: right;margin: 0px;line-height: 0;transform: rotateX(180deg) rotateY(180deg);-webkit-transform: rotateX(180deg) rotateY(180deg);-moz-transform: rotateX(180deg) rotateY(180deg);-o-transform: rotateX(180deg) rotateY(180deg);box-sizing: border-box;">          <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;width: 78px;height: auto;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_png/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVI6dOQkwHER7jCbZUyBeB7wKx5yfTiaoUoJw944TfGsnnFY7TciaCOBCA/640?wx_fmt=png&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>        </section>      </section>    </section>  </section>  <section style="font-size: 14px;font-family: PingFangSC-light;box-sizing: border-box;">    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>👉🏻<a class="weapp_text_link js_weapp_entry" href="https://hotel.gqmg.com/p?startPoint=%E5%8C%97%E4%BA%AC&f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" target="_blank" rel="external nofollow noopener" referrerpolicy="unsafe-url"><span textstyle style="font-size: 15px">【世界遗产在北京】</span></a></span></p>    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span style="font-size: 14px;box-sizing: border-box;"><span><span textstyle style="font-size: 15px">📆5天4晚</span></span></span></p>    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>漫游紫禁城、天坛追寻古老祭天礼、参观皇家御园。满城秋色，最是人间留不住。</span></p>  </section>  <section style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;">    <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_png/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVmrQupmxg5LNOAPa2d0Pc6ZeMlmxVDLAIkViaUbO1iccn9cCt7pmY8tUw/640?wx_fmt=png&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align:middle;max-width:100%;width:100%;box-sizing:border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>  </section>  <section style="font-size: 14px;font-family: PingFangSC-light;box-sizing: border-box;">    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>👉🏻<a class="weapp_text_link js_weapp_entry" href="https://hotel.gqmg.com/p?startPoint=%E9%84%82%E5%B0%94%E5%A4%9A%E6%96%AF&f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" target="_blank" rel="external nofollow noopener" referrerpolicy="unsafe-url"><span textstyle style="font-size: 15px">【库布齐轻装徒步】</span></a></span></p>    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span style="font-size: 14px;box-sizing: border-box;"><span><span textstyle style="font-size: 15px">📆5天4晚</span></span></span></p>    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>私享沙海秘境，越野车穿沙，在沙漠游泳，夜游古城，跟随专业讲解走进云冈石窟。</span></p>  </section>  <section style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;">    <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_jpg/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVQe6N1JUGqDtictejNjQksnsBal0Hu4ngkOmtIftqcZgFk2T4j36Dg8Q/640?wx_fmt=jpeg&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align:middle;max-width:100%;width:100%;box-sizing:border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>  </section>  <section style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;">    <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_jpg/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVBQ4yP0TibMFpDkSFMfHtJC7Y9NUBCORMKicZYkmV0IUh9Aus7UAj5Hmg/640?wx_fmt=jpeg&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align:middle;max-width:100%;width:100%;box-sizing:border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>  </section>  <section style="margin: 0px;box-sizing: border-box;">    <section style="font-size: 12px;color: rgb(160, 160, 160);font-family: PingFangSC-light;box-sizing: border-box;">      <p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>领队拍摄</span></p>    </section>  </section>  <section style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;width: 100%;align-self: flex-start;box-sizing: border-box;">    <section style="margin: 0px 0px 8px;width: 100%;box-sizing: border-box;">      <section style="font-size: 14px;text-align: justify;font-family: PingFangSC-light;width: 100%;box-sizing: border-box;">        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>👉🏻<a class="weapp_text_link js_weapp_entry" href="https://hotel.gqmg.com/p?startPoint=%E5%BC%A0%E5%AE%B6%E5%8F%A3&f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" target="_blank" rel="external nofollow noopener" referrerpolicy="unsafe-url"><span textstyle style="font-size: 15px">【金秋坝上】</span></a></span></p>        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span style="font-size: 14px;box-sizing: border-box;"><span><span textstyle style="font-size: 15px">📆6天5晚</span></span></span></p>        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>高性价比赏秋线 ，游侠客坝上牧歌营地+草原火锅，看马术表演、乘越野车穿越、马背骑行，超多草原游牧体验！</span></p>      </section>    </section>  </section>  <section style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;">    <section style="display: inline-block;vertical-align: top;width: 50%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;">      <section style="text-align: center;margin: 0px 0px 10px;line-height: 0;box-sizing: border-box;">        <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;width: 95%;height: auto;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_jpg/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVJo9jm53iblGcM9ic6jNU4EaqRlcYOnKibvezFwvI7Quc9JIAy8YAIKzLQ/640?wx_fmt=jpeg&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align:middle;max-width:100%;width:100%;box-sizing:border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>      </section>    </section>    <section style="display: inline-block;vertical-align: top;width: 50%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;">      <section style="text-align: center;margin: 0px 0px 10px;line-height: 0;box-sizing: border-box;">        <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;width: 95%;height: auto;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_jpg/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVNG406lvc0PGFcJ9ziaf5l94GibEAlvPsPmOYbvGakLiac9zhsH3BEJkxw/640?wx_fmt=jpeg&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align:middle;max-width:100%;width:100%;box-sizing:border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>      </section>    </section>  </section>  <section style="margin: 0px 0px 12px;box-sizing: border-box;">    <section style="text-align: center;font-family: PingFangSC-light;font-size: 12px;color: rgb(160, 160, 160);box-sizing: border-box;">      <p style="margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>左图@蛮牛 右图@江月</span></p>    </section>  </section>  <section style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 0px 0px 8px;width: 100%;align-self: flex-start;box-sizing: border-box;">    <section style="font-size: 14px;text-align: justify;font-family: PingFangSC-light;width: 100%;box-sizing: border-box;">      <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>      <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>👉🏻<a class="weapp_text_link js_weapp_entry" href="https://hotel.gqmg.com/p/115?f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" target="_blank" rel="external nofollow noopener" referrerpolicy="unsafe-url"><span textstyle style="font-size: 15px">【亲子·金秋坝上】</span></a></span></p>      <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span style="font-size: 14px;box-sizing: border-box;"><span><span textstyle style="font-size: 15px">📆6天5晚</span></span></span></p>      <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>宝妈宝爸也可以选择这一条坝上秋色线，大人美美下午茶、小孩营地肆意撒欢。升级增加七彩森林+甘丹驼城，更多小动物互动和内蒙文化体验。</span></p>    </section>  </section>  <section style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;">    <section style="display: inline-block;vertical-align: top;width: 50%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;">      <section style="text-align: center;margin: 0px 0px 10px;line-height: 0;box-sizing: border-box;">        <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;width: 95%;height: auto;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_jpg/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVs6s2IOFuABiaJhZUfkWchH4w4u8lKSYaGyyN42FJ6lXb58Nf6uNT8Ng/640?wx_fmt=jpeg&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align:middle;max-width:100%;width:100%;box-sizing:border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>      </section>    </section>    <section style="display: inline-block;vertical-align: top;width: 50%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;">      <section style="text-align: center;margin: 0px 0px 10px;line-height: 0;box-sizing: border-box;">        <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;width: 95%;height: auto;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_jpg/LicckDpL06qkHNpzchicibUA2DtkdpVjyzV4sFyz05JGVtvv7Pm4KRk0Kud6vox0mVxEkLHNNiaH6sqkGbfAc8icsAw/640?wx_fmt=jpeg&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align:middle;max-width:100%;width:100%;box-sizing:border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>      </section>    </section>  </section>  <section style="font-size: 14px;box-sizing: border-box;">    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>  </section>  <section style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;">    <section style="display: inline-block;vertical-align: top;width: auto;align-self: flex-start;flex: 0 0 auto;line-height: 0;min-width: 5%;max-width: 100%;height: auto;margin: 0px;z-index: 1;padding: 0px;box-sizing: border-box;">      <section style="margin: 3px 0px 0px;box-sizing: border-box;">        <section style="display: inline-block;width: 18px;height: 18px;vertical-align: top;overflow: hidden;border-radius: 252px;background-color: rgb(242, 90, 138);box-sizing: border-box;">          <section style="color: rgb(255, 255, 255);line-height: 1.6;font-size: 12px;box-sizing: border-box;">            <p style="margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><span textstyle style="font-weight: bold">5</span></span></p>          </section>        </section>      </section>      <section style="display: flex;width: 100%;flex-flow: column;box-sizing: border-box;">        <section style="z-index: 1;box-sizing: border-box;">          <section style="display: inline-block;width: 3px;height: 6px;vertical-align: top;overflow: hidden;background-color: rgb(185, 196, 200);box-sizing: border-box;">            <section style="text-align: justify;box-sizing: border-box;">              <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>            </section>          </section>        </section>      </section>      <section style="margin: -3px 0px 0px;box-sizing: border-box;">        <section style="display: inline-block;width: 13px;height: 6px;vertical-align: top;overflow: hidden;border-radius: 99%;background-color: rgb(87, 87, 87);box-sizing: border-box;">          <section style="text-align: justify;box-sizing: border-box;">            <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>          </section>        </section>      </section>    </section>    <section style="display: inline-block;vertical-align: top;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;padding: 0px 0px 0px 7px;align-self: flex-start;box-sizing: border-box;">      <section style="text-align: justify;color: rgb(255, 188, 0);font-family: PingFangSC-light;box-sizing: border-box;">        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><b style="box-sizing: border-box;"><span>深圳出发</span></b></p>      </section>      <section style="transform: perspective(0px);-webkit-transform: perspective(0px);-moz-transform: perspective(0px);-o-transform: perspective(0px);transform-style: flat;box-sizing: border-box;">        <section style="text-align: right;margin: 0px;line-height: 0;transform: rotateX(180deg) rotateY(180deg);-webkit-transform: rotateX(180deg) rotateY(180deg);-moz-transform: rotateX(180deg) rotateY(180deg);-o-transform: rotateX(180deg) rotateY(180deg);box-sizing: border-box;">          <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;width: 78px;height: auto;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_png/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVI6dOQkwHER7jCbZUyBeB7wKx5yfTiaoUoJw944TfGsnnFY7TciaCOBCA/640?wx_fmt=png&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>        </section>      </section>    </section>  </section>  <section style="margin: 0px 0px 8px;box-sizing: border-box;">    <section style="font-size: 14px;font-family: PingFangSC-light;box-sizing: border-box;">      <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>👉🏻<a class="weapp_text_link js_weapp_entry" href="https://hotel.gqmg.com/p?startPoint=%E6%B7%B1%E5%9C%B3&endPoint=%E9%A6%99%E6%B8%AF&f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" target="_blank" rel="external nofollow noopener" referrerpolicy="unsafe-url"><span textstyle style="font-size: 15px">【香港四径】</span></a></span></p>      <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span style="font-size: 14px;box-sizing: border-box;"><span><span textstyle style="font-size: 15px">📆5天4晚</span></span></span></p>      <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>一次打卡世界级知名四大径精华！卫奕信径9段、麦理浩径2段、凤凰径2段、港岛径8段</span></p>    </section>  </section>  <section style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;">    <section style="display: inline-block;vertical-align: top;width: 50%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;">      <section style="text-align: center;margin: 0px 0px 10px;line-height: 0;box-sizing: border-box;">        <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;width: 95%;height: auto;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_jpg/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVQic0yAoibyKUY9hia7YI4nY9JEBK6vJU9UeiaZzV8wOibjtgObDdibh2jrKQ/640?wx_fmt=jpeg&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align:middle;max-width:100%;width:100%;box-sizing:border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>      </section>    </section>    <section style="display: inline-block;vertical-align: top;width: 50%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;">      <section style="text-align: center;margin: 0px 0px 10px;line-height: 0;box-sizing: border-box;">        <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;width: 95%;height: auto;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_jpg/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVkibf8mzibVAqxzt1NB2BuorpweicfAvicsrVGkL6N7ZZkSeZjvOnqicfHWA/640?wx_fmt=jpeg&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align:middle;max-width:100%;width:100%;box-sizing:border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>      </section>    </section>  </section>  <section style="margin: 0px;box-sizing: border-box;">    <section style="text-align: center;font-family: PingFangSC-light;font-size: 12px;color: rgb(160, 160, 160);box-sizing: border-box;">      <p style="margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>左图麦理浩径@忆雪 右图破边洲@阿辉</span></p>    </section>  </section>  <section style="font-size: 12px;box-sizing: border-box;">    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>  </section>  <section style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;">    <section style="display: inline-block;vertical-align: top;width: auto;align-self: flex-start;flex: 0 0 auto;line-height: 0;min-width: 5%;max-width: 100%;height: auto;margin: 0px;z-index: 1;padding: 0px;box-sizing: border-box;">      <section style="margin: 3px 0px 0px;box-sizing: border-box;">        <section style="display: inline-block;width: 18px;height: 18px;vertical-align: top;overflow: hidden;border-radius: 252px;background-color: rgb(242, 90, 138);box-sizing: border-box;">          <section style="color: rgb(255, 255, 255);line-height: 1.6;font-size: 12px;box-sizing: border-box;">            <p style="margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><span textstyle style="font-weight: bold">6</span></span></p>          </section>        </section>      </section>      <section style="display: flex;width: 100%;flex-flow: column;box-sizing: border-box;">        <section style="z-index: 1;box-sizing: border-box;">          <section style="display: inline-block;width: 3px;height: 6px;vertical-align: top;overflow: hidden;background-color: rgb(185, 196, 200);box-sizing: border-box;">            <section style="text-align: justify;box-sizing: border-box;">              <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>            </section>          </section>        </section>      </section>      <section style="margin: -3px 0px 0px;box-sizing: border-box;">        <section style="display: inline-block;width: 13px;height: 6px;vertical-align: top;overflow: hidden;border-radius: 99%;background-color: rgb(87, 87, 87);box-sizing: border-box;">          <section style="text-align: justify;box-sizing: border-box;">            <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>          </section>        </section>      </section>    </section>    <section style="display: inline-block;vertical-align: top;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;padding: 0px 0px 0px 7px;align-self: flex-start;box-sizing: border-box;">      <section style="text-align: justify;color: rgb(255, 188, 0);font-family: PingFangSC-light;box-sizing: border-box;">        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><b style="box-sizing: border-box;"><span>南宁出发</span></b></p>      </section>      <section style="transform: perspective(0px);-webkit-transform: perspective(0px);-moz-transform: perspective(0px);-o-transform: perspective(0px);transform-style: flat;box-sizing: border-box;">        <section style="text-align: right;margin: 0px;line-height: 0;transform: rotateX(180deg) rotateY(180deg);-webkit-transform: rotateX(180deg) rotateY(180deg);-moz-transform: rotateX(180deg) rotateY(180deg);-o-transform: rotateX(180deg) rotateY(180deg);box-sizing: border-box;">          <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;width: 78px;height: auto;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_png/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVI6dOQkwHER7jCbZUyBeB7wKx5yfTiaoUoJw944TfGsnnFY7TciaCOBCA/640?wx_fmt=png&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>        </section>      </section>    </section>  </section>  <section style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;">    <section style="display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;">      <section style="font-size: 14px;text-align: justify;font-family: PingFangSC-light;box-sizing: border-box;">        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>👉🏻<a class="weapp_text_link js_weapp_entry" href="https://hotel.gqmg.com/p?startPoint=%E5%8D%97%E5%AE%81&f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" target="_blank" rel="external nofollow noopener" referrerpolicy="unsafe-url"><span textstyle style="font-size: 15px">【田园靖西】</span></a></span></p>        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span style="font-size: 14px;box-sizing: border-box;"><span><span textstyle style="font-size: 15px">📆4天3晚/5天4晚</span></span></span></p>        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>广西最后一个不为人知的世外桃源，正值丰水期！2025新升级峒那屿湾行程，配合通灵大峡谷、德天跨国瀑布、鹅泉等西南边境小众景色，住明仕山庄沉浸感受写意山水</span></p>      </section>      <section style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;">        <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_jpg/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVicKNN7XY9lu46gZeWYRHMM3vIaoQelCaASRYm6WIjgGMFhPBHjJF3cA/640?wx_fmt=jpeg&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align:middle;max-width:100%;width:100%;box-sizing:border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>      </section>      <section style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;">        <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_jpg/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVufCjTpician0r7G6vP8mBSXZuKmAAViasOjHyiblFax9fCfJPJb6TEvyOQ/640?wx_fmt=jpeg&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align:middle;max-width:100%;width:100%;box-sizing:border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>      </section>    </section>  </section>  <section style="margin: 0px;box-sizing: border-box;">    <section style="font-size: 12px;color: rgb(160, 160, 160);font-family: PingFangSC-light;box-sizing: border-box;">      <p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>@晚风</span></p>    </section>  </section>  <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>  <section style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;">    <section style="display: inline-block;vertical-align: top;width: auto;align-self: flex-start;flex: 0 0 auto;line-height: 0;min-width: 5%;max-width: 100%;height: auto;margin: 0px;z-index: 1;padding: 0px;box-sizing: border-box;">      <section style="margin: 3px 0px 0px;box-sizing: border-box;">        <section style="display: inline-block;width: 18px;height: 18px;vertical-align: top;overflow: hidden;border-radius: 252px;background-color: rgb(242, 90, 138);box-sizing: border-box;">          <section style="color: rgb(255, 255, 255);line-height: 1.6;font-size: 12px;box-sizing: border-box;">            <p style="margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><span textstyle style="font-weight: bold">7</span></span></p>          </section>        </section>      </section>      <section style="display: flex;width: 100%;flex-flow: column;box-sizing: border-box;">        <section style="z-index: 1;box-sizing: border-box;">          <section style="display: inline-block;width: 3px;height: 6px;vertical-align: top;overflow: hidden;background-color: rgb(185, 196, 200);box-sizing: border-box;">            <section style="text-align: justify;box-sizing: border-box;">              <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>            </section>          </section>        </section>      </section>      <section style="margin: -3px 0px 0px;box-sizing: border-box;">        <section style="display: inline-block;width: 13px;height: 6px;vertical-align: top;overflow: hidden;border-radius: 99%;background-color: rgb(87, 87, 87);box-sizing: border-box;">          <section style="text-align: justify;box-sizing: border-box;">            <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>          </section>        </section>      </section>    </section>    <section style="display: inline-block;vertical-align: top;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;padding: 0px 0px 0px 7px;align-self: flex-start;box-sizing: border-box;">      <section style="text-align: justify;color: rgb(255, 188, 0);font-family: PingFangSC-light;box-sizing: border-box;">        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><b style="box-sizing: border-box;"><span>长沙出发</span></b></p>      </section>      <section style="transform: perspective(0px);-webkit-transform: perspective(0px);-moz-transform: perspective(0px);-o-transform: perspective(0px);transform-style: flat;box-sizing: border-box;">        <section style="text-align: right;margin: 0px;line-height: 0;transform: rotateX(180deg) rotateY(180deg);-webkit-transform: rotateX(180deg) rotateY(180deg);-moz-transform: rotateX(180deg) rotateY(180deg);-o-transform: rotateX(180deg) rotateY(180deg);box-sizing: border-box;">          <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;width: 78px;height: auto;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_png/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVI6dOQkwHER7jCbZUyBeB7wKx5yfTiaoUoJw944TfGsnnFY7TciaCOBCA/640?wx_fmt=png&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>        </section>      </section>    </section>  </section>  <section style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 0px 0px 8px;width: 100%;align-self: flex-start;box-sizing: border-box;">    <section style="font-size: 14px;text-align: justify;font-family: PingFangSC-light;width: 100%;box-sizing: border-box;">      <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>👉🏻<a class="weapp_text_link js_weapp_entry" href="https://hotel.gqmg.com/p?startPoint=%E9%95%BF%E6%B2%99&f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" target="_blank" rel="external nofollow noopener" referrerpolicy="unsafe-url"><span textstyle style="font-size: 15px">【穿越大湘西】</span></a></span></p>      <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span style="font-size: 14px;box-sizing: border-box;"><span><span textstyle style="font-size: 15px">📆7天6晚</span></span></span></p>      <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>槟榔谷探洞奇景，借母溪避世轻徒，车、船、行三结合，360度不回头花式深入湘西腹地。</span></p>    </section>  </section>  <section style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;">    <section style="display: inline-block;vertical-align: top;width: 50%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;">      <section style="text-align: center;margin: 0px 0px 10px;line-height: 0;box-sizing: border-box;">        <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;width: 95%;height: auto;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_jpg/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVswcNPEFfh6DvIam5eqRvRbd7OVuOcSKLdU5wrJciba8Vb7ricSicfycMg/640?wx_fmt=jpeg&amp;from=appmsg" class="rich_pages wxw-img ProseMirror-selectednode" style="vertical-align:middle;max-width:100%;width:100%;box-sizing:border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>      </section>    </section>    <section style="display: inline-block;vertical-align: top;width: 50%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;">      <section style="text-align: center;margin: 0px 0px 10px;line-height: 0;box-sizing: border-box;">        <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;width: 95%;height: auto;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_jpg/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVLcwRNE6F7woRKnfrR51Ap46SmZ350GA1HGPCvdjG2Ejx0NkicX8pIrg/640?wx_fmt=jpeg&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align:middle;max-width:100%;width:100%;box-sizing:border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>      </section>    </section>  </section>  <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>  <section style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;">    <section style="display: inline-block;vertical-align: top;width: auto;align-self: flex-start;flex: 0 0 auto;line-height: 0;min-width: 5%;max-width: 100%;height: auto;margin: 0px;z-index: 1;padding: 0px;box-sizing: border-box;">      <section style="margin: 3px 0px 0px;box-sizing: border-box;">        <section style="display: inline-block;width: 18px;height: 18px;vertical-align: top;overflow: hidden;border-radius: 252px;background-color: rgb(242, 90, 138);box-sizing: border-box;">          <section style="color: rgb(255, 255, 255);line-height: 1.6;font-size: 12px;box-sizing: border-box;">            <p style="margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><span textstyle style="font-weight: bold">8</span></span></p>          </section>        </section>      </section>      <section style="display: flex;width: 100%;flex-flow: column;box-sizing: border-box;">        <section style="z-index: 1;box-sizing: border-box;">          <section style="display: inline-block;width: 3px;height: 6px;vertical-align: top;overflow: hidden;background-color: rgb(185, 196, 200);box-sizing: border-box;">            <section style="text-align: justify;box-sizing: border-box;">              <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>            </section>          </section>        </section>      </section>      <section style="margin: -3px 0px 0px;box-sizing: border-box;">        <section style="display: inline-block;width: 13px;height: 6px;vertical-align: top;overflow: hidden;border-radius: 99%;background-color: rgb(87, 87, 87);box-sizing: border-box;">          <section style="text-align: justify;box-sizing: border-box;">            <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>          </section>        </section>      </section>    </section>    <section style="display: inline-block;vertical-align: top;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;padding: 0px 0px 0px 7px;align-self: flex-start;box-sizing: border-box;">      <section style="text-align: justify;color: rgb(255, 188, 0);font-family: PingFangSC-light;box-sizing: border-box;">        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><b style="box-sizing: border-box;"><span>宜昌出发</span></b></p>      </section>      <section style="transform: perspective(0px);-webkit-transform: perspective(0px);-moz-transform: perspective(0px);-o-transform: perspective(0px);transform-style: flat;box-sizing: border-box;">        <section style="text-align: right;margin: 0px;line-height: 0;transform: rotateX(180deg) rotateY(180deg);-webkit-transform: rotateX(180deg) rotateY(180deg);-moz-transform: rotateX(180deg) rotateY(180deg);-o-transform: rotateX(180deg) rotateY(180deg);box-sizing: border-box;">          <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;width: 78px;height: auto;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_png/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVI6dOQkwHER7jCbZUyBeB7wKx5yfTiaoUoJw944TfGsnnFY7TciaCOBCA/640?wx_fmt=png&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>        </section>      </section>    </section>  </section>  <section style="font-size: 14px;font-family: PingFangSC-light;box-sizing: border-box;">    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>👉🏻<a class="weapp_text_link js_weapp_entry" href="https://hotel.gqmg.com/p?startPoint=%E5%AE%9C%E6%98%8C&f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" target="_blank" rel="external nofollow noopener" referrerpolicy="unsafe-url"><span textstyle style="font-size: 15px">【征途·神农架】</span></a></span></p>    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span style="font-size: 14px;box-sizing: border-box;"><span><span textstyle style="font-size: 15px">📆4天3晚</span></span></span></p>    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>哀牢山同款，穿越高山草甸、原始森林，感受神农架神秘风貌，露营观星空看日出。</span></p>  </section>  <section style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;">    <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_png/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVhmNPoiaBs8AibZc2UVFT8Imxa2DYQRicD8jdu3uiaoAJp3Rkv2UpXfmysA/640?wx_fmt=png&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align:middle;max-width:100%;width:100%;box-sizing:border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>  </section>  <section style="text-align: center;margin: 10px 0px 0px;line-height: 0;box-sizing: border-box;">    <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_jpg/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVzF76OWvcVl7cVa4OCb6kg8Nc060kRe2mm2yYoKTvCEEqa3yEGPYXWQ/640?wx_fmt=jpeg&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align:middle;max-width:100%;width:100%;box-sizing:border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>  </section>  <section style="font-size: 12px;box-sizing: border-box;">    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>  </section>  <section style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;">    <section style="display: inline-block;vertical-align: top;width: auto;align-self: flex-start;flex: 0 0 auto;line-height: 0;min-width: 5%;max-width: 100%;height: auto;margin: 0px;z-index: 1;padding: 0px;box-sizing: border-box;">      <section style="margin: 3px 0px 0px;box-sizing: border-box;">        <section style="display: inline-block;width: 18px;height: 18px;vertical-align: top;overflow: hidden;border-radius: 252px;background-color: rgb(242, 90, 138);box-sizing: border-box;">          <section style="color: rgb(255, 255, 255);line-height: 1.6;font-size: 12px;box-sizing: border-box;">            <p style="margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><span textstyle style="font-weight: bold">9</span></span></p>          </section>        </section>      </section>      <section style="display: flex;width: 100%;flex-flow: column;box-sizing: border-box;">        <section style="z-index: 1;box-sizing: border-box;">          <section style="display: inline-block;width: 3px;height: 6px;vertical-align: top;overflow: hidden;background-color: rgb(185, 196, 200);box-sizing: border-box;">            <section style="text-align: justify;box-sizing: border-box;">              <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>            </section>          </section>        </section>      </section>      <section style="margin: -3px 0px 0px;box-sizing: border-box;">        <section style="display: inline-block;width: 13px;height: 6px;vertical-align: top;overflow: hidden;border-radius: 99%;background-color: rgb(87, 87, 87);box-sizing: border-box;">          <section style="text-align: justify;box-sizing: border-box;">            <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>          </section>        </section>      </section>    </section>    <section style="display: inline-block;vertical-align: top;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;padding: 0px 0px 0px 7px;align-self: flex-start;box-sizing: border-box;">      <section style="text-align: justify;color: rgb(255, 188, 0);font-family: PingFangSC-light;box-sizing: border-box;">        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><b style="box-sizing: border-box;"><span>成都出发</span></b></p>      </section>      <section style="transform: perspective(0px);-webkit-transform: perspective(0px);-moz-transform: perspective(0px);-o-transform: perspective(0px);transform-style: flat;box-sizing: border-box;">        <section style="text-align: right;margin: 0px;line-height: 0;transform: rotateX(180deg) rotateY(180deg);-webkit-transform: rotateX(180deg) rotateY(180deg);-moz-transform: rotateX(180deg) rotateY(180deg);-o-transform: rotateX(180deg) rotateY(180deg);box-sizing: border-box;">          <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;width: 78px;height: auto;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_png/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVI6dOQkwHER7jCbZUyBeB7wKx5yfTiaoUoJw944TfGsnnFY7TciaCOBCA/640?wx_fmt=png&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>        </section>      </section>    </section>  </section>  <section style="font-size: 14px;font-family: PingFangSC-light;box-sizing: border-box;">    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>👉🏻<a class="weapp_text_link js_weapp_entry" href="https://hotel.gqmg.com/p?startPoint=%E6%88%90%E9%83%BD&f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" target="_blank" rel="external nofollow noopener" referrerpolicy="unsafe-url"><span textstyle style="font-size: 15px">【川西雪山巡礼】</span></a></span></p>    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span style="font-size: 14px;box-sizing: border-box;"><span><span textstyle style="font-size: 15px">📆5天4晚</span></span></span></p>    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>川西三大神山一次看遍，夜宿牛背山星辰营地，参与即送定制冰箱贴，赠送牛背山utv车体验。</span></p>  </section>  <section style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;">    <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_jpg/LicckDpL06qkHNpzchicibUA2DtkdpVjyzV0XPxiaRwxrHxgwR76Wb5a1bdPLZR6U6wwEdtGmLhgvCIlJ1ib41Reprw/640?wx_fmt=jpeg&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align:middle;max-width:100%;width:100%;box-sizing:border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>  </section>  <section style="margin: 0px;box-sizing: border-box;">    <section style="font-size: 12px;color: rgb(160, 160, 160);font-family: PingFangSC-light;box-sizing: border-box;">      <p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>@修罗</span></p>    </section>  </section>  <section style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;">    <section style="display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;">      <section style="font-size: 14px;text-align: justify;font-family: PingFangSC-light;box-sizing: border-box;">        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>👉🏻<a class="weapp_text_link js_weapp_entry" href="https://hotel.gqmg.com/p?startPoint=%E6%88%90%E9%83%BD&endPoint=%E6%8B%89%E8%90%A8&f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" target="_blank" rel="external nofollow noopener" referrerpolicy="unsafe-url"><span textstyle style="font-size: 15px">【川西秘境徒步】</span></a></span></p>        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span style="font-size: 14px;box-sizing: border-box;"><span><span textstyle style="font-size: 15px">📆4天3晚</span></span></span></p>        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>耗时3年探出极致徒步路线，串联了塔公草原、雅拉雪山、贡嘎雪山、丹巴藏寨等绝美秘境。</span></p>      </section>      <section style="text-align: center;margin: 10px 0px 0px;line-height: 0;box-sizing: border-box;">        <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_jpg/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVkIGEhJMiaftDDpCibmZSmBfwB4eQ5Db4mlSBdu58zycbyOlI0AdrEKNQ/640?wx_fmt=jpeg&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align:middle;max-width:100%;width:100%;box-sizing:border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>      </section>      <section style="text-align: justify;box-sizing: border-box;">        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>      </section>    </section>  </section>  <section style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;">    <section style="display: inline-block;vertical-align: top;width: auto;align-self: flex-start;flex: 0 0 auto;line-height: 0;min-width: 5%;max-width: 100%;height: auto;margin: 0px;z-index: 1;padding: 0px;box-sizing: border-box;">      <section style="margin: 3px 0px 0px;box-sizing: border-box;">        <section style="display: inline-block;width: 18px;height: 18px;vertical-align: top;overflow: hidden;border-radius: 252px;background-color: rgb(242, 90, 138);box-sizing: border-box;">          <section style="color: rgb(255, 255, 255);line-height: 1.6;font-size: 12px;box-sizing: border-box;">            <p style="margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><span textstyle style="font-weight: bold">10</span></span></p>          </section>        </section>      </section>      <section style="display: flex;width: 100%;flex-flow: column;box-sizing: border-box;">        <section style="z-index: 1;box-sizing: border-box;">          <section style="display: inline-block;width: 3px;height: 6px;vertical-align: top;overflow: hidden;background-color: rgb(185, 196, 200);box-sizing: border-box;">            <section style="text-align: justify;box-sizing: border-box;">              <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>            </section>          </section>        </section>      </section>      <section style="margin: -3px 0px 0px;box-sizing: border-box;">        <section style="display: inline-block;width: 13px;height: 6px;vertical-align: top;overflow: hidden;border-radius: 99%;background-color: rgb(87, 87, 87);box-sizing: border-box;">          <section style="text-align: justify;box-sizing: border-box;">            <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>          </section>        </section>      </section>    </section>    <section style="display: inline-block;vertical-align: top;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;padding: 0px 0px 0px 7px;align-self: flex-start;box-sizing: border-box;">      <section style="text-align: justify;color: rgb(255, 188, 0);font-family: PingFangSC-light;box-sizing: border-box;">        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><b style="box-sizing: border-box;"><span>重庆出发</span></b></p>      </section>      <section style="transform: perspective(0px);-webkit-transform: perspective(0px);-moz-transform: perspective(0px);-o-transform: perspective(0px);transform-style: flat;box-sizing: border-box;">        <section style="text-align: right;margin: 0px;line-height: 0;transform: rotateX(180deg) rotateY(180deg);-webkit-transform: rotateX(180deg) rotateY(180deg);-moz-transform: rotateX(180deg) rotateY(180deg);-o-transform: rotateX(180deg) rotateY(180deg);box-sizing: border-box;">          <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;width: 78px;height: auto;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_png/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVI6dOQkwHER7jCbZUyBeB7wKx5yfTiaoUoJw944TfGsnnFY7TciaCOBCA/640?wx_fmt=png&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>        </section>      </section>    </section>  </section>  <section style="font-size: 14px;font-family: PingFangSC-light;box-sizing: border-box;">    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>👉🏻<a class="weapp_text_link js_weapp_entry" href="https://hotel.gqmg.com/p?startPoint=%E9%87%8D%E5%BA%86&f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" target="_blank" rel="external nofollow noopener" referrerpolicy="unsafe-url"><span textstyle style="font-size: 15px">【巴渝山城】</span></a></span></p>    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span style="font-size: 14px;box-sizing: border-box;"><span><span textstyle style="font-size: 15px">📆5天4晚</span></span></span></p>    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>重庆精华景点一次走遍。打卡两大世界遗产——大足石刻、武隆喀斯特，还有国家5A景区金佛山。</span></p>  </section>  <section style="text-align: center;margin: 10px 0px 0px;line-height: 0;box-sizing: border-box;">    <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_jpg/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVTbiazia3rnUrBNwKI3v2ZicRUI5F3xrG1vkxcglic8Afq5DOuPfQ9ibfmaw/640?wx_fmt=jpeg&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align:middle;max-width:100%;width:100%;box-sizing:border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>  </section>  <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>  <section style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;">    <section style="display: inline-block;vertical-align: top;width: auto;align-self: flex-start;flex: 0 0 auto;line-height: 0;min-width: 5%;max-width: 100%;height: auto;margin: 0px;z-index: 1;padding: 0px;box-sizing: border-box;">      <section style="margin: 3px 0px 0px;box-sizing: border-box;">        <section style="display: inline-block;width: 18px;height: 18px;vertical-align: top;overflow: hidden;border-radius: 252px;background-color: rgb(242, 90, 138);box-sizing: border-box;">          <section style="color: rgb(255, 255, 255);line-height: 1.6;font-size: 12px;box-sizing: border-box;">            <p style="margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><span textstyle style="font-weight: bold">11</span></span></p>          </section>        </section>      </section>      <section style="display: flex;width: 100%;flex-flow: column;box-sizing: border-box;">        <section style="z-index: 1;box-sizing: border-box;">          <section style="display: inline-block;width: 3px;height: 6px;vertical-align: top;overflow: hidden;background-color: rgb(185, 196, 200);box-sizing: border-box;">            <section style="text-align: justify;box-sizing: border-box;">              <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>            </section>          </section>        </section>      </section>      <section style="margin: -3px 0px 0px;box-sizing: border-box;">        <section style="display: inline-block;width: 13px;height: 6px;vertical-align: top;overflow: hidden;border-radius: 99%;background-color: rgb(87, 87, 87);box-sizing: border-box;">          <section style="text-align: justify;box-sizing: border-box;">            <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>          </section>        </section>      </section>    </section>    <section style="display: inline-block;vertical-align: top;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;padding: 0px 0px 0px 7px;align-self: flex-start;box-sizing: border-box;">      <section style="text-align: justify;color: rgb(255, 188, 0);font-family: PingFangSC-light;box-sizing: border-box;">        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><b style="box-sizing: border-box;"><span>郑州出发</span></b></p>      </section>      <section style="transform: perspective(0px);-webkit-transform: perspective(0px);-moz-transform: perspective(0px);-o-transform: perspective(0px);transform-style: flat;box-sizing: border-box;">        <section style="text-align: right;margin: 0px;line-height: 0;transform: rotateX(180deg) rotateY(180deg);-webkit-transform: rotateX(180deg) rotateY(180deg);-moz-transform: rotateX(180deg) rotateY(180deg);-o-transform: rotateX(180deg) rotateY(180deg);box-sizing: border-box;">          <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;width: 78px;height: auto;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_png/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVI6dOQkwHER7jCbZUyBeB7wKx5yfTiaoUoJw944TfGsnnFY7TciaCOBCA/640?wx_fmt=png&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>        </section>      </section>    </section>  </section>  <section style="font-size: 14px;font-family: PingFangSC-light;box-sizing: border-box;">    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>👉🏻<a class="weapp_text_link js_weapp_entry" href="https://hotel.gqmg.com/p?startPoint=%E9%83%91%E5%B7%9E&f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" target="_blank" rel="external nofollow noopener" referrerpolicy="unsafe-url"><span textstyle style="font-size: 15px">【飞跃太行】</span></a></span></p>    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span style="font-size: 14px;box-sizing: border-box;"><span><span textstyle style="font-size: 15px">📆5天4晚</span></span></span></p>    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>南太行经典休闲轻户外线路，结合精华景点：郭亮+王莽岭+天界山+八里沟，风光、人文兼具。</span></p>  </section>  <section style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;">    <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_jpg/LicckDpL06qkHNpzchicibUA2DtkdpVjyzV0F2LvBiaBElOHSgf6qaFgXriaoc13DQq4VjHkx18ic6wATNzia0zJJJo7A/640?wx_fmt=jpeg&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align:middle;max-width:100%;width:100%;box-sizing:border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>  </section>  <section style="margin: 0px;box-sizing: border-box;">    <section style="font-size: 12px;color: rgb(160, 160, 160);font-family: PingFangSC-light;box-sizing: border-box;">      <p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>@可航</span></p>    </section>  </section>  <section style="font-size: 14px;font-family: PingFangSC-light;box-sizing: border-box;">    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>👉🏻<a class="weapp_text_link js_weapp_entry" href="https://hotel.gqmg.com/p?startPoint=%E9%83%91%E5%B7%9E&endPoint=%E6%8B%89%E8%90%A8&f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" target="_blank" rel="external nofollow noopener" referrerpolicy="unsafe-url"><span textstyle style="font-size: 15px">【征途南太行·经典版】</span></a></span></p>    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span style="font-size: 14px;box-sizing: border-box;"><span><span textstyle style="font-size: 15px">📆5天4晚</span></span></span></p>    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>如果你体力还不错，也可选择这一条！户外必走经典，国家地理推荐目的地。</span></p>  </section>  <section style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;">    <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_jpg/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVQ35bJY5EIcpic44ZibPbzKcnrX4zjJVsWmhCEDnlJlnd88BgXWDadViaw/640?wx_fmt=jpeg&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align:middle;max-width:100%;width:100%;box-sizing:border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>  </section>  <section style="margin: 0px;box-sizing: border-box;">    <section style="font-size: 12px;color: rgb(160, 160, 160);font-family: PingFangSC-light;box-sizing: border-box;">      <p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>王莽岭日出@泊瑾</span></p>    </section>  </section>  <section style="font-size: 14px;box-sizing: border-box;">    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>  </section></section><section style="box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);">  <section style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;">    <section style="display: inline-block;vertical-align: top;width: auto;align-self: flex-start;flex: 0 0 auto;line-height: 0;min-width: 5%;max-width: 100%;height: auto;margin: 0px;z-index: 1;padding: 0px;box-sizing: border-box;">      <section style="margin: 3px 0px 0px;box-sizing: border-box;">        <section style="display: inline-block;width: 18px;height: 18px;vertical-align: top;overflow: hidden;border-radius: 252px;background-color: rgb(242, 90, 138);box-sizing: border-box;">          <section style="color: rgb(255, 255, 255);line-height: 1.6;font-size: 12px;box-sizing: border-box;">            <p style="margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><span textstyle style="font-weight: bold">12</span></span></p>          </section>        </section>      </section>      <section style="display: flex;width: 100%;flex-flow: column;box-sizing: border-box;">        <section style="z-index: 1;box-sizing: border-box;">          <section style="display: inline-block;width: 3px;height: 6px;vertical-align: top;overflow: hidden;background-color: rgb(185, 196, 200);box-sizing: border-box;">            <section style="text-align: justify;box-sizing: border-box;">              <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>            </section>          </section>        </section>      </section>      <section style="margin: -3px 0px 0px;box-sizing: border-box;">        <section style="display: inline-block;width: 13px;height: 6px;vertical-align: top;overflow: hidden;border-radius: 99%;background-color: rgb(87, 87, 87);box-sizing: border-box;">          <section style="text-align: justify;box-sizing: border-box;">            <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>          </section>        </section>      </section>    </section>    <section style="display: inline-block;vertical-align: top;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;padding: 0px 0px 0px 7px;align-self: flex-start;box-sizing: border-box;">      <section style="text-align: justify;color: rgb(255, 188, 0);font-family: PingFangSC-light;box-sizing: border-box;">        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><b style="box-sizing: border-box;"><span>大同出发</span></b></p>      </section>      <section style="transform: perspective(0px);-webkit-transform: perspective(0px);-moz-transform: perspective(0px);-o-transform: perspective(0px);transform-style: flat;box-sizing: border-box;">        <section style="text-align: right;margin: 0px;line-height: 0;transform: rotateX(180deg) rotateY(180deg);-webkit-transform: rotateX(180deg) rotateY(180deg);-moz-transform: rotateX(180deg) rotateY(180deg);-o-transform: rotateX(180deg) rotateY(180deg);box-sizing: border-box;">          <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;width: 78px;height: auto;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_png/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVI6dOQkwHER7jCbZUyBeB7wKx5yfTiaoUoJw944TfGsnnFY7TciaCOBCA/640?wx_fmt=png&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>        </section>      </section>    </section>  </section>  <section style="font-family: PingFangSC-light;font-size: 14px;box-sizing: border-box;">    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>👉🏻<a class="weapp_text_link js_weapp_entry" href="https://hotel.gqmg.com/p?startPoint=%E5%A4%A7%E5%90%8C&f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" target="_blank" rel="external nofollow noopener" referrerpolicy="unsafe-url"><span textstyle style="font-size: 15px">【秦晋风云加长版】</span></a></span></p>    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span style="font-size: 14px;box-sizing: border-box;"><span><span textstyle style="font-size: 15px">📆9天8晚</span></span></span></p>    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>走进黄土高原核心区，感受地道的民俗人文和壮丽的绝美风光。小众目的地，避开人从众！</span><span><br class="ProseMirror-trailingBreak"></span></p>    <section style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;">      <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_jpg/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVrnk8FXGH0QOvictibM2libuyvLzXdmHPStBv1jqbyz1syR4BhhoDYYbPQ/640?wx_fmt=jpeg&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align:middle;max-width:100%;width:100%;box-sizing:border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>    </section>    <section style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;">      <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_jpg/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVsXia0wrib7wbq5IkulW7YhSkXo3IBXVVHJrhIurcpvh6NwXvUZRYEdew/640?wx_fmt=jpeg&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align:middle;max-width:100%;width:100%;box-sizing:border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>    </section>    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>  </section>  <section style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;">    <section style="display: inline-block;vertical-align: top;width: auto;align-self: flex-start;flex: 0 0 auto;line-height: 0;min-width: 5%;max-width: 100%;height: auto;margin: 0px;z-index: 1;padding: 0px;box-sizing: border-box;">      <section style="margin: 3px 0px 0px;box-sizing: border-box;">        <section style="display: inline-block;width: 18px;height: 18px;vertical-align: top;overflow: hidden;border-radius: 252px;background-color: rgb(242, 90, 138);box-sizing: border-box;">          <section style="color: rgb(255, 255, 255);line-height: 1.6;font-size: 12px;box-sizing: border-box;">            <p style="margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><span textstyle style="font-weight: bold">13</span></span></p>          </section>        </section>      </section>      <section style="display: flex;width: 100%;flex-flow: column;box-sizing: border-box;">        <section style="z-index: 1;box-sizing: border-box;">          <section style="display: inline-block;width: 3px;height: 6px;vertical-align: top;overflow: hidden;background-color: rgb(185, 196, 200);box-sizing: border-box;">            <section style="text-align: justify;box-sizing: border-box;">              <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>            </section>          </section>        </section>      </section>      <section style="margin: -3px 0px 0px;box-sizing: border-box;">        <section style="display: inline-block;width: 13px;height: 6px;vertical-align: top;overflow: hidden;border-radius: 99%;background-color: rgb(87, 87, 87);box-sizing: border-box;">          <section style="text-align: justify;box-sizing: border-box;">            <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>          </section>        </section>      </section>    </section>    <section style="display: inline-block;vertical-align: top;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;padding: 0px 0px 0px 7px;align-self: flex-start;box-sizing: border-box;">      <section style="text-align: justify;color: rgb(255, 188, 0);font-family: PingFangSC-light;box-sizing: border-box;">        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><b style="box-sizing: border-box;"><span>兰州出发</span></b></p>      </section>      <section style="transform: perspective(0px);-webkit-transform: perspective(0px);-moz-transform: perspective(0px);-o-transform: perspective(0px);transform-style: flat;box-sizing: border-box;">        <section style="text-align: right;margin: 0px;line-height: 0;transform: rotateX(180deg) rotateY(180deg);-webkit-transform: rotateX(180deg) rotateY(180deg);-moz-transform: rotateX(180deg) rotateY(180deg);-o-transform: rotateX(180deg) rotateY(180deg);box-sizing: border-box;">          <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;width: 78px;height: auto;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_png/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVI6dOQkwHER7jCbZUyBeB7wKx5yfTiaoUoJw944TfGsnnFY7TciaCOBCA/640?wx_fmt=png&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>        </section>      </section>    </section>  </section>  <section style="font-size: 14px;font-family: PingFangSC-light;box-sizing: border-box;">    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>👉🏻<a class="weapp_text_link js_weapp_entry" href="https://hotel.gqmg.com/p?startPoint=%E5%85%B0%E5%B7%9E&f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" target="_blank" rel="external nofollow noopener" referrerpolicy="unsafe-url"><span textstyle style="font-size: 15px">【亲子·大漠星空】</span></a></span></p>    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span style="font-size: 14px;box-sizing: border-box;"><span><span textstyle style="font-size: 15px">📆5天4晚</span></span></span></p>    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>去星星的故乡，感受不一样的大西北。乘坐特色交通羊皮筏子、毛驴车、骆驼车；住农家、吃西北菜、星空露营。</span></p>  </section>  <section style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;">    <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_jpg/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVnKXqV5sHVPE1t7ibo7UDxgxo8aNGENswIIcoRly7eibJNiaOlXDGMg9Lw/640?wx_fmt=jpeg&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align:middle;max-width:100%;width:100%;box-sizing:border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>  </section>  <section style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;">    <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_jpg/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVdJZPKGJPqaqN7VocMgY6pByia9EJC3MegQGa3P45icTcVYxrhDqQ1BDw/640?wx_fmt=jpeg&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align:middle;max-width:100%;width:100%;box-sizing:border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>  </section>  <section style="font-size: 12px;box-sizing: border-box;">    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>  </section>  <section style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;">    <section style="display: inline-block;vertical-align: top;width: auto;align-self: flex-start;flex: 0 0 auto;line-height: 0;min-width: 5%;max-width: 100%;height: auto;margin: 0px;z-index: 1;padding: 0px;box-sizing: border-box;">      <section style="margin: 3px 0px 0px;box-sizing: border-box;">        <section style="display: inline-block;width: 18px;height: 18px;vertical-align: top;overflow: hidden;border-radius: 252px;background-color: rgb(242, 90, 138);box-sizing: border-box;">          <section style="color: rgb(255, 255, 255);line-height: 1.6;font-size: 12px;box-sizing: border-box;">            <p style="margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><span textstyle style="font-weight: bold">14</span></span></p>          </section>        </section>      </section>      <section style="display: flex;width: 100%;flex-flow: column;box-sizing: border-box;">        <section style="z-index: 1;box-sizing: border-box;">          <section style="display: inline-block;width: 3px;height: 6px;vertical-align: top;overflow: hidden;background-color: rgb(185, 196, 200);box-sizing: border-box;">            <section style="text-align: justify;box-sizing: border-box;">              <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>            </section>          </section>        </section>      </section>      <section style="margin: -3px 0px 0px;box-sizing: border-box;">        <section style="display: inline-block;width: 13px;height: 6px;vertical-align: top;overflow: hidden;border-radius: 99%;background-color: rgb(87, 87, 87);box-sizing: border-box;">          <section style="text-align: justify;box-sizing: border-box;">            <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>          </section>        </section>      </section>    </section>    <section style="display: inline-block;vertical-align: top;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;padding: 0px 0px 0px 7px;align-self: flex-start;box-sizing: border-box;">      <section style="text-align: justify;color: rgb(255, 188, 0);font-family: PingFangSC-light;box-sizing: border-box;">        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><b style="box-sizing: border-box;"><span>银川出发</span></b></p>      </section>      <section style="transform: perspective(0px);-webkit-transform: perspective(0px);-moz-transform: perspective(0px);-o-transform: perspective(0px);transform-style: flat;box-sizing: border-box;">        <section style="text-align: right;margin: 0px;line-height: 0;transform: rotateX(180deg) rotateY(180deg);-webkit-transform: rotateX(180deg) rotateY(180deg);-moz-transform: rotateX(180deg) rotateY(180deg);-o-transform: rotateX(180deg) rotateY(180deg);box-sizing: border-box;">          <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;width: 78px;height: auto;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_png/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVI6dOQkwHER7jCbZUyBeB7wKx5yfTiaoUoJw944TfGsnnFY7TciaCOBCA/640?wx_fmt=png&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>        </section>      </section>    </section>  </section>  <section style="font-size: 14px;font-family: PingFangSC-light;box-sizing: border-box;">    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>👉🏻<a class="weapp_text_link js_weapp_entry" href="https://hotel.gqmg.com/p?startPoint=%E9%93%B6%E5%B7%9D&f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" target="_blank" rel="external nofollow noopener" referrerpolicy="unsafe-url"><span textstyle style="font-size: 15px">【腾格里五湖连穿】</span></a></span></p>    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span style="font-size: 14px;box-sizing: border-box;"><span><span textstyle style="font-size: 15px">📆5天4晚</span></span></span></p>    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>穿越金色沙海，邂逅长生天的眼泪！是时候解锁人生第一座沙漠了！</span></p>  </section>  <section style="text-align: center;margin: 10px 0px 0px;line-height: 0;box-sizing: border-box;">    <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_jpg/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVKFSKQSsT6QJ2dibXunHcggCg82aojTtXBQG46via3MY3dUB1ZEmvvgBQ/640?wx_fmt=jpeg&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align:middle;max-width:100%;width:100%;box-sizing:border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>  </section>  <section style="font-size: 14px;box-sizing: border-box;">    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>  </section>  <section style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;">    <section style="display: inline-block;vertical-align: top;width: auto;align-self: flex-start;flex: 0 0 auto;line-height: 0;min-width: 5%;max-width: 100%;height: auto;margin: 0px;z-index: 1;padding: 0px;box-sizing: border-box;">      <section style="margin: 3px 0px 0px;box-sizing: border-box;">        <section style="display: inline-block;width: 18px;height: 18px;vertical-align: top;overflow: hidden;border-radius: 252px;background-color: rgb(242, 90, 138);box-sizing: border-box;">          <section style="color: rgb(255, 255, 255);line-height: 1.6;font-size: 12px;box-sizing: border-box;">            <p style="margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><span textstyle style="font-size: 12px; font-weight: bold">15</span></span></p>          </section>        </section>      </section>      <section style="display: flex;width: 100%;flex-flow: column;box-sizing: border-box;">        <section style="z-index: 1;box-sizing: border-box;">          <section style="display: inline-block;width: 3px;height: 6px;vertical-align: top;overflow: hidden;background-color: rgb(185, 196, 200);box-sizing: border-box;">            <section style="text-align: justify;box-sizing: border-box;">              <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>            </section>          </section>        </section>      </section>      <section style="margin: -3px 0px 0px;box-sizing: border-box;">        <section style="display: inline-block;width: 13px;height: 6px;vertical-align: top;overflow: hidden;border-radius: 99%;background-color: rgb(87, 87, 87);box-sizing: border-box;">          <section style="text-align: justify;box-sizing: border-box;">            <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>          </section>        </section>      </section>    </section>    <section style="display: inline-block;vertical-align: top;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;padding: 0px 0px 0px 7px;align-self: flex-start;box-sizing: border-box;">      <section style="text-align: justify;color: rgb(255, 188, 0);font-family: PingFangSC-light;box-sizing: border-box;">        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><b style="box-sizing: border-box;"><span>哈尔滨出发</span></b></p>      </section>      <section style="transform: perspective(0px);-webkit-transform: perspective(0px);-moz-transform: perspective(0px);-o-transform: perspective(0px);transform-style: flat;box-sizing: border-box;">        <section style="text-align: right;margin: 0px;line-height: 0;transform: rotateX(180deg) rotateY(180deg);-webkit-transform: rotateX(180deg) rotateY(180deg);-moz-transform: rotateX(180deg) rotateY(180deg);-o-transform: rotateX(180deg) rotateY(180deg);box-sizing: border-box;">          <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;width: 78px;height: auto;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_png/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVI6dOQkwHER7jCbZUyBeB7wKx5yfTiaoUoJw944TfGsnnFY7TciaCOBCA/640?wx_fmt=png&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>        </section>      </section>    </section>  </section>  <section style="font-size: 14px;font-family: PingFangSC-light;box-sizing: border-box;">    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>👉🏻<a class="weapp_text_link js_weapp_entry" href="https://hotel.gqmg.com/p?startPoint=%E5%93%88%E5%B0%94%E6%BB%A8&endPoint=%E5%91%BC%E4%BC%A6%E8%B4%9D%E5%B0%94&f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" target="_blank" rel="external nofollow noopener" referrerpolicy="unsafe-url"><span textstyle style="font-size: 15px">【呼伦贝尔秋色】</span></a></span></p>    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span style="font-size: 14px;box-sizing: border-box;"><span><span textstyle style="font-size: 15px">📆7天6晚</span></span></span></p>    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>阿尔山、额尔古纳湿地、白桦林、卡线公路、蘑阿公路......经典秋色一网打尽，入住阿尔山景区内，游玩时间更充足！</span></p>  </section>  <section style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;">    <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_jpg/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVUyINyTtnediboJOiazZVIIAnsMVvt9NXkw00f3IQ8ciamVqTRib5XqicWcw/640?wx_fmt=jpeg&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align:middle;max-width:100%;width:100%;box-sizing:border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>  </section>  <section style="margin: 0px;box-sizing: border-box;">    <section style="font-size: 12px;color: rgb(160, 160, 160);font-family: PingFangSC-light;box-sizing: border-box;">      <p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>阿尔山驼峰岭天池@宋新子</span></p>    </section>  </section>  <section style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;">    <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_jpg/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVU6hEFanuCXur7icAUULRaVJodSoHofibl7jDTRIzQPQTYzJJ4icXp4PWQ/640?wx_fmt=jpeg&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align:middle;max-width:100%;width:100%;box-sizing:border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>  </section>  <section style="margin: 0px;box-sizing: border-box;">    <section style="font-size: 12px;color: rgb(160, 160, 160);font-family: PingFangSC-light;box-sizing: border-box;">      <p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>额尔古纳@忆雪</span></p>    </section>  </section>  <section style="font-size: 12px;box-sizing: border-box;">    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>  </section>  <section style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;">    <section style="display: inline-block;vertical-align: top;width: auto;align-self: flex-start;flex: 0 0 auto;line-height: 0;min-width: 5%;max-width: 100%;height: auto;margin: 0px;z-index: 1;padding: 0px;box-sizing: border-box;">      <section style="margin: 3px 0px 0px;box-sizing: border-box;">        <section style="display: inline-block;width: 18px;height: 18px;vertical-align: top;overflow: hidden;border-radius: 252px;background-color: rgb(242, 90, 138);box-sizing: border-box;">          <section style="color: rgb(255, 255, 255);line-height: 1.6;font-size: 12px;box-sizing: border-box;">            <p style="margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><span textstyle style="font-weight: bold">16</span></span></p>          </section>        </section>      </section>      <section style="display: flex;width: 100%;flex-flow: column;box-sizing: border-box;">        <section style="z-index: 1;box-sizing: border-box;">          <section style="display: inline-block;width: 3px;height: 6px;vertical-align: top;overflow: hidden;background-color: rgb(185, 196, 200);box-sizing: border-box;">            <section style="text-align: justify;box-sizing: border-box;">              <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>            </section>          </section>        </section>      </section>      <section style="margin: -3px 0px 0px;box-sizing: border-box;">        <section style="display: inline-block;width: 13px;height: 6px;vertical-align: top;overflow: hidden;border-radius: 99%;background-color: rgb(87, 87, 87);box-sizing: border-box;">          <section style="text-align: justify;box-sizing: border-box;">            <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>          </section>        </section>      </section>    </section>    <section style="display: inline-block;vertical-align: top;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;padding: 0px 0px 0px 7px;align-self: flex-start;box-sizing: border-box;">      <section style="text-align: justify;color: rgb(255, 188, 0);font-family: PingFangSC-light;box-sizing: border-box;">        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><b style="box-sizing: border-box;"><span>长春出发</span></b></p>      </section>      <section style="transform: perspective(0px);-webkit-transform: perspective(0px);-moz-transform: perspective(0px);-o-transform: perspective(0px);transform-style: flat;box-sizing: border-box;">        <section style="text-align: right;margin: 0px;line-height: 0;transform: rotateX(180deg) rotateY(180deg);-webkit-transform: rotateX(180deg) rotateY(180deg);-moz-transform: rotateX(180deg) rotateY(180deg);-o-transform: rotateX(180deg) rotateY(180deg);box-sizing: border-box;">          <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;width: 78px;height: auto;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_png/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVI6dOQkwHER7jCbZUyBeB7wKx5yfTiaoUoJw944TfGsnnFY7TciaCOBCA/640?wx_fmt=png&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>        </section>      </section>    </section>  </section>  <section style="font-size: 14px;font-family: PingFangSC-light;box-sizing: border-box;">    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>👉🏻<a class="weapp_text_link js_weapp_entry" href="https://hotel.gqmg.com/p?startPoint=%E9%95%BF%E6%98%A5&f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" target="_blank" rel="external nofollow noopener" referrerpolicy="unsafe-url"><span textstyle style="font-size: 15px">【东北秋色】</span></a></span></p>    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span style="font-size: 14px;box-sizing: border-box;"><span><span textstyle style="font-size: 15px">📆7天6晚</span></span></span></p>    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>天池、瀑布、堰塞湖、彩林、红枫、... ...地质与色彩奇妙互动，还安排了温泉、人参林秋色轻徒步、百年木屋村民俗等体验。</span></p>  </section>  <section style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;">    <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_jpg/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVbFS8LrYibjVYBm6VdaHpLBq0ic3buyQicmNIpJBDsJ6FHAgJ9kqRRWorQ/640?wx_fmt=jpeg&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align:middle;max-width:100%;width:100%;box-sizing:border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>  </section>  <section style="margin: 0px;box-sizing: border-box;">    <section style="font-size: 12px;color: rgb(160, 160, 160);font-family: PingFangSC-light;box-sizing: border-box;">      <p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>老边沟@kris陈瑞瑞</span></p>    </section>  </section>  <section style="font-size: 12px;box-sizing: border-box;">    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>  </section>  <section style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;">    <section style="display: inline-block;vertical-align: top;width: auto;align-self: flex-start;flex: 0 0 auto;line-height: 0;min-width: 5%;max-width: 100%;height: auto;margin: 0px;z-index: 1;padding: 0px;box-sizing: border-box;">      <section style="margin: 3px 0px 0px;box-sizing: border-box;">        <section style="display: inline-block;width: 18px;height: 18px;vertical-align: top;overflow: hidden;border-radius: 252px;background-color: rgb(242, 90, 138);box-sizing: border-box;">          <section style="color: rgb(255, 255, 255);line-height: 1.6;font-size: 12px;box-sizing: border-box;">            <p style="margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><span textstyle style="font-weight: bold">17</span></span></p>          </section>        </section>      </section>      <section style="display: flex;width: 100%;flex-flow: column;box-sizing: border-box;">        <section style="z-index: 1;box-sizing: border-box;">          <section style="display: inline-block;width: 3px;height: 6px;vertical-align: top;overflow: hidden;background-color: rgb(185, 196, 200);box-sizing: border-box;">            <section style="text-align: justify;box-sizing: border-box;">              <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>            </section>          </section>        </section>      </section>      <section style="margin: -3px 0px 0px;box-sizing: border-box;">        <section style="display: inline-block;width: 13px;height: 6px;vertical-align: top;overflow: hidden;border-radius: 99%;background-color: rgb(87, 87, 87);box-sizing: border-box;">          <section style="text-align: justify;box-sizing: border-box;">            <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>          </section>        </section>      </section>    </section>    <section style="display: inline-block;vertical-align: top;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;padding: 0px 0px 0px 7px;align-self: flex-start;box-sizing: border-box;">      <section style="text-align: justify;color: rgb(255, 188, 0);font-family: PingFangSC-light;box-sizing: border-box;">        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><b style="box-sizing: border-box;"><span>拉萨出发</span></b></p>      </section>      <section style="transform: perspective(0px);-webkit-transform: perspective(0px);-moz-transform: perspective(0px);-o-transform: perspective(0px);transform-style: flat;box-sizing: border-box;">        <section style="text-align: right;margin: 0px;line-height: 0;transform: rotateX(180deg) rotateY(180deg);-webkit-transform: rotateX(180deg) rotateY(180deg);-moz-transform: rotateX(180deg) rotateY(180deg);-o-transform: rotateX(180deg) rotateY(180deg);box-sizing: border-box;">          <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;width: 78px;height: auto;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_png/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVI6dOQkwHER7jCbZUyBeB7wKx5yfTiaoUoJw944TfGsnnFY7TciaCOBCA/640?wx_fmt=png&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>        </section>      </section>    </section>  </section>  <section style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;">    <section style="display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;">      <section style="font-size: 14px;text-align: justify;font-family: PingFangSC-light;box-sizing: border-box;">        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>👉🏻<a class="weapp_text_link js_weapp_entry" href="https://hotel.gqmg.com/p?startPoint=%E6%8B%89%E8%90%A8&f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" target="_blank" rel="external nofollow noopener" referrerpolicy="unsafe-url"><span textstyle style="font-size: 15px">【库拉岗日转山】</span></a></span></p>        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span style="font-size: 14px;box-sizing: border-box;"><span><span textstyle style="font-size: 15px">📆6天5晚</span></span></span></p>        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>想开启人生第一次高海拔徒步？你想0距离接触一次雪山圣湖？来这条经典西藏户外线！</span></p>      </section>      <section style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;">        <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_jpg/LicckDpL06qkHNpzchicibUA2DtkdpVjyzV4HLIYbW3ibvKk5Ps7aesU1XcOg9loeJH5YrmVXqCGXeRXEzDcnZfe7Q/640?wx_fmt=jpeg&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align:middle;max-width:100%;width:100%;box-sizing:border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>      </section>      <section style="text-align: center;margin: 10px 0px 0px;line-height: 0;box-sizing: border-box;">        <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_jpg/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVuIpoibFZheDHic4mahw6q5OrpkuAuaxK1icxkZSyOfYoKU3tkDtTtiax0Q/640?wx_fmt=jpeg&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align:middle;max-width:100%;width:100%;box-sizing:border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>      </section>      <section style="font-size: 12px;text-align: justify;box-sizing: border-box;">        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>      </section>    </section>  </section>  <section style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;">    <section style="display: inline-block;vertical-align: top;width: auto;align-self: flex-start;flex: 0 0 auto;line-height: 0;min-width: 5%;max-width: 100%;height: auto;margin: 0px;z-index: 1;padding: 0px;box-sizing: border-box;">      <section style="margin: 3px 0px 0px;box-sizing: border-box;">        <section style="display: inline-block;width: 18px;height: 18px;vertical-align: top;overflow: hidden;border-radius: 252px;background-color: rgb(242, 90, 138);box-sizing: border-box;">          <section style="color: rgb(255, 255, 255);line-height: 1.6;font-size: 12px;box-sizing: border-box;">            <p style="margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><span textstyle style="font-weight: bold">18</span></span></p>          </section>        </section>      </section>      <section style="display: flex;width: 100%;flex-flow: column;box-sizing: border-box;">        <section style="z-index: 1;box-sizing: border-box;">          <section style="display: inline-block;width: 3px;height: 6px;vertical-align: top;overflow: hidden;background-color: rgb(185, 196, 200);box-sizing: border-box;">            <section style="text-align: justify;box-sizing: border-box;">              <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>            </section>          </section>        </section>      </section>      <section style="margin: -3px 0px 0px;box-sizing: border-box;">        <section style="display: inline-block;width: 13px;height: 6px;vertical-align: top;overflow: hidden;border-radius: 99%;background-color: rgb(87, 87, 87);box-sizing: border-box;">          <section style="text-align: justify;box-sizing: border-box;">            <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>          </section>        </section>      </section>    </section>    <section style="display: inline-block;vertical-align: top;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;padding: 0px 0px 0px 7px;align-self: flex-start;box-sizing: border-box;">      <section style="text-align: justify;color: rgb(255, 188, 0);font-family: PingFangSC-light;box-sizing: border-box;">        <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><b style="box-sizing: border-box;"><span>乌鲁木齐出发</span></b></p>      </section>      <section style="transform: perspective(0px);-webkit-transform: perspective(0px);-moz-transform: perspective(0px);-o-transform: perspective(0px);transform-style: flat;box-sizing: border-box;">        <section style="text-align: right;margin: 0px;line-height: 0;transform: rotateX(180deg) rotateY(180deg);-webkit-transform: rotateX(180deg) rotateY(180deg);-moz-transform: rotateX(180deg) rotateY(180deg);-o-transform: rotateX(180deg) rotateY(180deg);box-sizing: border-box;">          <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;width: 78px;height: auto;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_png/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVI6dOQkwHER7jCbZUyBeB7wKx5yfTiaoUoJw944TfGsnnFY7TciaCOBCA/640?wx_fmt=png&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>        </section>      </section>    </section>  </section>  <section style="font-size: 14px;font-family: PingFangSC-light;box-sizing: border-box;">    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>👉🏻<a class="weapp_text_link js_weapp_entry" href="https://hotel.gqmg.com/p?startPoint=%E4%B9%8C%E9%B2%81%E6%9C%A8%E9%BD%90&endPoint=%E5%96%80%E7%BA%B3%E6%96%AF&f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" target="_blank" rel="external nofollow noopener" referrerpolicy="unsafe-url"><span textstyle style="font-size: 15px">【野奢邦·北疆秋色】</span></a></span></p>    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span style="font-size: 14px;box-sizing: border-box;"><span><span textstyle style="font-size: 15px">📆7天6晚</span></span></span></p>    <p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>北疆秋色野奢之选，入住金秋油画般的景区木屋，专车免排队直通喀纳斯秘境，将每一分钟都留给顶级秋色盛宴。</span></p>  </section>  <section style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;">    <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;box-sizing: border-box;margin-left: 0px;margin-right: 0px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_jpg/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVMrlNLQMvsibxSUxlnqHN1IuMstd5whV319jOhIia6BicF4zUtZtP78QOw/640?wx_fmt=jpeg&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align:middle;max-width:100%;width:100%;box-sizing:border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>  </section>  <section style="display: inline-block;max-width: 100%;box-sizing: border-box;">    <section style="line-height: 0;max-width: 100%;box-sizing: border-box;">      <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;text-align: center;font-family: system-ui, -apple-system, BlinkMacSystemFont, &quot;Helvetica Neue&quot;, &quot;PingFang SC&quot;, &quot;Hiragino Sans GB&quot;, &quot;Microsoft YaHei UI&quot;, &quot;Microsoft YaHei&quot;, Arial, sans-serif;visibility: visible;box-sizing: border-box;margin-left: 0px;margin-right: 0px;margin-bottom: 8px;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_gif/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVBYvNibQ3rZpkzWh6oftHZCqsJ1ceJr0MR8sXJBBiaAB1E6Dmicopn41ibg/640?wx_fmt=gif&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>    </section>  </section>  <section style="text-align: center;font-family: PingFangSC-light;font-size: 14px;box-sizing: border-box;">    <p style="margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>跟着小侠精选一起出发！</span><span><br class="ProseMirror-trailingBreak"></span></p>    <p style="margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>假期提前定！出游不踩雷！</span></p>    <p style="margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>更多【国庆路线】可点击下方图片查看👇🏻</span></p>    <section style="text-align: center;margin: 16px 0px 8px;line-height: 2em;"><a class="weapp_image_link js_weapp_entry" style><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_jpg/LicckDpL06qkHNpzchicibUA2DtkdpVjyzVMvwXJXS73cPMuWF9JCQ8qyfeugt6t7XhYlGuFgpbL4QzkPZD9ias2Ww/640?wx_fmt=jpeg&amp;from=appmsg" class="rich_pages wxw-img js_insertlocalimg" type="block" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></a></section>    <section style="box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);">      <section style="box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);">        <section style="box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);">          <section style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;">            <section style="display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;">              <section style="max-width: 100%;box-sizing: border-box;">                <section style="line-height: 0;-webkit-tap-highlight-color: transparent;outline: 0px;max-width: 100%;box-sizing: border-box;">                  <section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;-webkit-tap-highlight-color: transparent;outline: 0px;visibility: visible;box-sizing: border-box;" nodeleaf><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_png/LicckDpL06qmVIbdRv9dviayicKcaR2D0sKicWnS899iaoMQm3eEHk4Q8RXDNbOlzTBH2ArEkcb1xkLhYia2YCcopp7A/640?wx_fmt=png&amp;from=appmsg" class="rich_pages wxw-img" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></section>                </section>              </section>              <section style="text-align: justify;font-family: PingFangSC-light;font-size: 14px;box-sizing: border-box;">                <section style="text-align: center;font-family: PingFangSC-light;font-size: 12px;color: rgb(160, 160, 160);box-sizing: border-box;">                  <section style="line-height: 0;-webkit-tap-highlight-color: transparent;outline: 0px;max-width: 100%;box-sizing: border-box;">                    <section style="box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);">                      <section style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;">                        <section style="display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;">                          <section style="text-align: center;font-family: PingFangSC-light;font-size: 12px;color: rgb(154, 154, 142);box-sizing: border-box;">                            <p style="margin: 0px 8px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span>编辑@踏雪</span></p>                            <section style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;">                              <section style="text-align: justify;font-family: PingFangSC-light;font-size: 14px;box-sizing: border-box;">                                <section style="margin: 8px 8px 0px;-webkit-tap-highlight-color: transparent;outline: 0px;font-size: 16px;letter-spacing: 0.544px;text-align: center;caret-color: rgba(0, 0, 0, 0);line-height: 2em;"><span style="-webkit-tap-highlight-color: transparent;outline: 0px;font-size: 12px;color: rgb(136, 136, 136);letter-spacing: 0.544px;font-family: Optima-Regular, PingFangTC-light;"><a class="weapp_image_link js_weapp_entry" style="color:var(--weui-LINK);outline:0px;cursor:default;user-select:none;width:100%"><img src="https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_gif/LicckDpL06qmI8ib75ELAPaianXViaz2uk61X2oBcIrcuHhnJvRpkNDWXo4LY7PIJJ5Tfkj7G0I9WtqjNIYRP6SpzQ/640?wx_fmt=gif&amp;from=appmsg&amp;wxfrom=5&amp;wx_lazy=1&amp;tp=webp" class="rich_pages wxw-img __bg_gif" style="-webkit-tap-highlight-color: transparent;outline: 0px;border-width: 0px;border-style: initial;border-color: initial;width: 100%;visibility: visible !important;" contenteditable="false"><img class="ProseMirror-separator" alt><br class="ProseMirror-trailingBreak"></a></span></section>                                <section style="margin-left: 8px;margin-right: 8px;line-height: 2em;"><strong style="-webkit-tap-highlight-color: transparent;margin-top: 0px;margin-bottom: 0px;padding: 0px;outline: 0px;max-width: 100%;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: 0.544px;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;font-size: 16px;caret-color: rgba(0, 0, 0, 0);background-color: rgb(255, 255, 255);color: rgba(0, 0, 0, 0.8);font-family: PingFangSC-light;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="-webkit-tap-highlight-color: transparent;margin-top: 0px;margin-bottom: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><br class="ProseMirror-trailingBreak"></span>                                    <section style="margin-left: 8px;margin-right: 8px;text-align: justify;line-height: 2em;"><strong style="-webkit-tap-highlight-color: transparent;margin-top: 0px;margin-bottom: 0px;padding: 0px;outline: 0px;max-width: 100%;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: 0.544px;orphans: 2;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;font-size: 16px;caret-color: rgba(0, 0, 0, 0);background-color: rgb(255, 255, 255);color: rgba(0, 0, 0, 0.8);font-family: PingFangSC-light;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="-webkit-tap-highlight-color: transparent;margin-top: 0px;margin-bottom: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span textstyle style="font-size: 14px">👇 点击</span></span><span style="-webkit-tap-highlight-color: transparent;margin-top: 0px;margin-bottom: 0px;padding: 0px;outline: 0px;max-width: 100%;color: rgb(255, 169, 0);box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="-webkit-tap-highlight-color: transparent;margin-top: 0px;margin-bottom: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span textstyle style="font-size: 14px">【阅读原文】</span><span textstyle style="font-size: 14px; color: rgb(0, 0, 0)">查看专栏内容了解更多</span></span></span></strong></section>                                  </strong></section>                              </section>                            </section>                          </section>                        </section>                      </section>                    </section>                  </section>                </section>              </section>            </section>          </section>        </section>      </section>    </section>    <p style="margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span><br class="ProseMirror-trailingBreak"></span></p>  </section></section>]]></content>
    
    <summary type="html">
    
      &lt;style&gt;.posts-expand .post-body img {
      border: none !important;
    }
&lt;/style&gt;
&lt;section style=&quot;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);&quot;&gt;
  &lt;section style=&quot;max-width: 100%;margin-left: 8px;margin-right: 8px;box-sizing: border-box;&quot;&gt;
    &lt;section style=&quot;line-height: 0;text-align: center;max-width: 100%;box-sizing: border-box;&quot;&gt;
      &lt;section style=&quot;max-width: 100%;vertical-align: middle;display: inline-block;line-height: 2em;box-sizing: border-box;margin-left: 0px;margin-right: 0px;&quot; nodeleaf&gt;&lt;img src=&quot;https://s.gqmg.com/https://mmbiz.qpic.cn/mmbiz_gif/LicckDpL06qkHNpzchicibUA2DtkdpVjyzV9Xp98iaIQOYm0z3srJOxIM7GUmJQy8LNwTJ1BgWeL7iatmNPicXicQic15Q/640?wx_fmt=gif&amp;amp;from=appmsg&quot; class=&quot;rich_pages wxw-img&quot; style=&quot;vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;&quot; contenteditable=&quot;false&quot;&gt;&lt;img class=&quot;ProseMirror-separator&quot; alt&gt;&lt;br class=&quot;ProseMirror-trailingBreak&quot;&gt;&lt;/section&gt;
    &lt;/section&gt;
  &lt;/section&gt;
  &lt;section style=&quot;text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;&quot;&gt;
    &lt;section style=&quot;display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;&quot;&gt;
      &lt;section style=&quot;text-align: justify;font-family: PingFangSC-light;font-size: 14px;box-sizing: border-box;&quot;&gt;
        &lt;p style=&quot;text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;&quot;&gt;&lt;span&gt;七月中旬，是谁坐在工位默默羡慕&lt;/span&gt;&lt;/p&gt;
        &lt;p style=&quot;text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;&quot;&gt;&lt;span&gt;小孩哥/姐趁着暑假出门看世界？&lt;/span&gt;&lt;/p&gt;
        &lt;p style=&quot;text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;&quot;&gt;&lt;span&gt;🥵🥵🥵&lt;/span&gt;&lt;span&gt;&lt;br class=&quot;ProseMirror-trailingBreak&quot;&gt;&lt;/span&gt;&lt;/p&gt;
        &lt;p style=&quot;text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;&quot;&gt;&lt;span&gt;&lt;br class=&quot;ProseMirror-trailingBreak&quot;&gt;&lt;/span&gt;&lt;/p&gt;
        &lt;p style=&quot;text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;&quot;&gt;&lt;span&gt;7&amp;amp;8&amp;amp;9三个月的&lt;/span&gt;&lt;span style=&quot;color: rgb(255, 188, 0);box-sizing: border-box;&quot;&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;&lt;span&gt;假&lt;/span&gt;&lt;span style=&quot;font-style: normal;justify-content: flex-start;flex-flow: row;vertical-align: top;align-self: flex-start;flex: 0 0 auto;font-family: PingFangSC-light;font-size: 14px;text-align: center;color: rgb(255, 188, 0);font-weight: bold;box-sizing: border-box;&quot;&gt;期空窗&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
        &lt;p style=&quot;text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;&quot;&gt;&lt;span&gt;日子显得尤为漫长&lt;/span&gt;&lt;/p&gt;
        &lt;p style=&quot;text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;&quot;&gt;&lt;span style=&quot;background-color: rgb(255, 188, 0);color: rgb(255, 255, 255);font-size: 16px;box-sizing: border-box;&quot;&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;&lt;span&gt;&amp;nbsp;翘首期盼国庆！！&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
        &lt;p style=&quot;text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;&quot;&gt;&lt;span&gt;&amp;nbsp;想想那时被秋意覆盖的景色，就蠢蠢欲动&lt;/span&gt;&lt;/p&gt;
        &lt;p style=&quot;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;&quot;&gt;&lt;span&gt;&lt;br class=&quot;ProseMirror-trailingBreak&quot;&gt;&lt;/span&gt;&lt;/p&gt;
      &lt;/section&gt;
    
    </summary>
    
      <category term="东写西读" scheme="https://blogs.kainy.cn/categories/%E4%B8%9C%E5%86%99%E8%A5%BF%E8%AF%BB/"/>
    
      <category term="生活点滴" scheme="https://blogs.kainy.cn/categories/%E4%B8%9C%E5%86%99%E8%A5%BF%E8%AF%BB/%E7%94%9F%E6%B4%BB%E7%82%B9%E6%BB%B4/"/>
    
    
      <category term="旅游" scheme="https://blogs.kainy.cn/tags/%E6%97%85%E6%B8%B8/"/>
    
      <category term="住宿" scheme="https://blogs.kainy.cn/tags/%E4%BD%8F%E5%AE%BF/"/>
    
      <category term="国庆" scheme="https://blogs.kainy.cn/tags/%E5%9B%BD%E5%BA%86/"/>
    
      <category term="黄金周" scheme="https://blogs.kainy.cn/tags/%E9%BB%84%E9%87%91%E5%91%A8/"/>
    
  </entry>
  
  <entry>
    <title>产品复盘：从一个“双面人生”洞察，到三个“价值钩子”设计「旅游决策不是选择题，而是情感叙事」</title>
    <link href="https://blogs.kainy.cn/2025/07/%E4%BA%A7%E5%93%81%E5%A4%8D%E7%9B%98%EF%BC%9A%E4%BB%8E%E4%B8%80%E4%B8%AA%E2%80%9C%E5%8F%8C%E9%9D%A2%E4%BA%BA%E7%94%9F%E2%80%9D%E6%B4%9E%E5%AF%9F%EF%BC%8C%E5%88%B0%E4%B8%89%E4%B8%AA%E2%80%9C%E4%BB%B7%E5%80%BC%E9%92%A9%E5%AD%90%E2%80%9D%E8%AE%BE%E8%AE%A1%E3%80%8C%E6%97%85%E6%B8%B8%E5%86%B3%E7%AD%96%E4%B8%8D%E6%98%AF%E9%80%89%E6%8B%A9%E9%A2%98%EF%BC%8C%E8%80%8C%E6%98%AF%E6%83%85%E6%84%9F%E5%8F%99%E4%BA%8B%E3%80%8D/"/>
    <id>https://blogs.kainy.cn/2025/07/产品复盘：从一个“双面人生”洞察，到三个“价值钩子”设计「旅游决策不是选择题，而是情感叙事」/</id>
    <published>2025-07-29T02:50:34.000Z</published>
    <updated>2026-08-01T09:28:07.945Z</updated>
    
    <content type="html"><![CDATA[<p>本文首发于：人人都是产品经理</p><hr><p>今天想和大家拆解一个我们近期打磨的<a href="https://hotel.gqmg.com/plan?f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE#blogs" title="旅行产品" rel="external nofollow noopener" referrerpolicy="unsafe-url" target="_blank">旅行产品</a>构思。起因很简单，就是我们发现，旅行App这个赛道实在是太“卷”了。大家都在做比价、做筛选、做推荐，想尽办法给用户提供“更多、更快、更省”的选择。</p><p>但我们一直在反思一个问题：<strong>给用户无限的选择，真的让他们更快乐了吗？</strong></p><a id="more"></a><p>有没有可能，当用户在几十个酒店页面之间反复横跳、耗费数小时后，他们收获的不是选择的快感，而是“<strong>害怕选错”的深度焦虑</strong>？</p><p>正是基于这个反思，我们尝试跳出“工具思维”，去挖掘一个被巨头们忽视的用户情感洞察。</p><p>这里，我想把这个有趣的思考过程和大家分享一下，希望能给大家带来一点新的启发。</p><h4 id="第一部分：我们的“Aha-Moment”——发现用户内心的“双面人生”"><a href="#第一部分：我们的“Aha-Moment”——发现用户内心的“双面人生”" class="headerlink" title="第一部分：我们的“Aha Moment”——发现用户内心的“双面人生”"></a><strong>第一部分：我们的“Aha Moment”——发现用户内心的“双面人生</strong>”</h4><p>我们发现，几乎每一个旅行者的内心，都住着两个既矛盾又和谐的“小人儿”：</p><ol><li><p>一个是“<strong>聪明的价值发现者</strong>”：他追求的不是绝对的低价，而是“用有限的预算，撬动了最大快乐”的那种<strong>智力上的成就感</strong>。比如用一顿快餐的钱，吃到了本地人才知道的神级路边摊。我们管这叫“<strong>实惠线路</strong>”，但它的内核是“高性价比的智慧”。</p></li><li><p>另一个是“<strong>生活品质的追求者</strong>”：他渴望在某个特殊时刻，能毫不犹豫地犒劳自己，创造一个“值得铭记一生的瞬间”。他买的不是服务，而是<strong>一个梦想的兑现和一段美好的回忆</strong>。我们称之为“<strong>优质线路</strong>”，内核是“把钱投资在回忆上”。</p></li></ol><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2025/07/mdnycklq.png" alt></p><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2025/07/mdnydv2u.png" alt></p><p>绝大多数App，都在强迫用户在这两个“自我”中二选一。而我们的“Aha Moment”就是：<strong>为什么不能两个都要呢？</strong></p><p>我们要做的不应该是裁判，而应该像一个懂他的挚友，把两种最好的可能性都精心打包好，摆在他面前说：“嘿，无论你想扮演哪个角色，这都是为你准备的、最精彩的剧本。”</p><p>这就是我们整个产品设计的原点：<strong>二元选择的魅力 (The Power of Duality)</strong>。</p><h4 id="第二部分：从洞察到落地——我们如何设计三个“价值钩子”"><a href="#第二部分：从洞察到落地——我们如何设计三个“价值钩子”" class="headerlink" title="第二部分：从洞察到落地——我们如何设计三个“价值钩子”"></a><strong>第二部分：从洞察到落地——我们如何设计三个“价值钩子</strong>”</h4><p>一个好的洞察如果不能落地为用户可感知的功能，那就只是空中楼阁。所以，我们围绕这个“双面人生”的洞察，设计了三个环环相扣的价值主张，或者说，三个能让用户“哇哦”出来的产品点。</p><p><strong>价值点一：交付“决策自信”，而不只是“一堆选项</strong>”</p><ul><li><strong>我们想解决什么？</strong> 解决用户“怕选错”的焦虑感。</li><li><strong>我们是怎么做的？</strong> 我们不提供清单，而是提供两个“闭眼入都不会错”的精选答案。同时，在产品呈现上，用感性的“人格化”标题来放大这种自信：<ul><li><strong>实惠线路 -&gt; “轻装上路：聪明旅者的发现之旅</strong>”</li><li><strong>优质线路 -&gt; “犒赏时刻：不容错过的品质之选</strong>”</li></ul></li><li><strong>背后的思考：</strong> 我们想让用户从“我该怎么选？”的疑问句，变成“原来两种选择都这么棒！”的感叹句。营销上，我们的口号也从“帮你省钱”变成了 “<strong>告别选择困难，两条路都是好风景</strong>”。</li></ul><p><strong>价值点二：交付“故事脚本”，而不只是“一条路线</strong>”</p><ul><li><strong>我们想满足什么？</strong> 满足用户创造和分享故事的深层社交需求。</li><li><strong>我们是怎么做的？</strong> 我们构思了一个叫“<strong>一键生成旅行海报</strong>”的功能。当用户选定一条线路，App会立刻生成一张超酷的、适合发朋友圈的“旅行计划图”。上面有路线图、城市亮点和那句很酷的线路“人格”标签。</li><li><strong>背后的思考：</strong> 这是我们为产品设计的<strong>增长飞轮</strong>。用户分享的不再是“我订了个酒店”的无聊信息，而是“<strong>看！我的下一趟史诗级旅程已经规划好了！</strong>” 这种对未来美好体验的“预炫耀”，社交传播力是惊人的。我们甚至连活动 tag 都想好了，就叫#<strong>我的双面旅程</strong>#。</li></ul><p><strong>价值点三：交付“沿途的惊喜”，而不只是“固定的折扣</strong>”</p><ul><li><strong>我们想平衡什么？</strong> 平衡旅行中“计划的安稳感”与“探索的惊喜感”。</li><li><strong>我们是怎么做的？</strong> 我们在规划好住宿这个最大确定性的同时，引入了一个叫“<strong>城市彩蛋</strong>”的功能。在每个途径城市，我们会根据线路属性，埋下一个小惊喜：<ul><li><strong>实惠线路的彩蛋：</strong> 可能是“绕出高速5分钟，尝尝这家本地司机都赞不绝口的XX面馆。”</li><li><strong>优质线路的彩蛋：</strong> 可能是“这家酒店的屋顶酒吧下午5-7点对外开放，是欣赏城市日落的绝佳秘密机位。”</li></ul></li><li><strong>背后的思考：</strong> 这一下就盘活了我们的<strong>内容生态</strong>。我们可以围绕“城市彩蛋”创作大量深度内容，去更广阔的领域（比如公路旅行、深度游社群）吸引那些还没想好住哪、但对旅途充满向往的潜在用户。</li></ul><h4 id="第三部分：最后的升华——为你的产品找到“灵魂”"><a href="#第三部分：最后的升华——为你的产品找到“灵魂”" class="headerlink" title="第三部分：最后的升华——为你的产品找到“灵魂”"></a><strong>第三部分：最后的升华——为你的产品找到“灵魂</strong>”</h4><p>聊到这里，我们内部对这个产品的定义也彻底变了。</p><p>它不再是一个“酒店优惠查询应用”，甚至不只是一个“行程规划工具”。</p><p>我们觉得，它的新身份，应该是一个“<strong>旅行双线叙事家” (A Dual-Narrative Journey Curator)</strong>。</p><p>它的使命，是帮助每一个用户，探索和拥抱他们内心那个独一无二的“<strong>务实梦想家</strong>”。</p><p>今天把这个思考过程完整地分享出来，并不是说这个想法已经完美无缺。而是我们觉得，这个从“用户表层需求”下探到“用户内在心理矛盾”，再由此构建产品价值和增长飞轮的思路，本身就非常有趣。</p><p>希望这个案例，也能给各位PM同学带来一点启发，帮助大家在日常繁杂的功能迭代中，偶尔跳出来想一想：<strong>我们产品的“灵魂”到底是什么？我们到底在为用户提供一种怎样的情感价值？</strong></p><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2025/07/mdny83vj.png" alt></p><p>谢谢大家！欢迎一起交流。</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;本文首发于：人人都是产品经理&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;今天想和大家拆解一个我们近期打磨的&lt;a href=&quot;https://hotel.gqmg.com/plan?f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE#blogs&quot; title=&quot;旅行产品&quot; rel=&quot;external nofollow noopener&quot; referrerpolicy=&quot;unsafe-url&quot; target=&quot;_blank&quot;&gt;旅行产品&lt;/a&gt;构思。起因很简单，就是我们发现，旅行App这个赛道实在是太“卷”了。大家都在做比价、做筛选、做推荐，想尽办法给用户提供“更多、更快、更省”的选择。&lt;/p&gt;
&lt;p&gt;但我们一直在反思一个问题：&lt;strong&gt;给用户无限的选择，真的让他们更快乐了吗？&lt;/strong&gt;&lt;/p&gt;
    
    </summary>
    
      <category term="东写西读" scheme="https://blogs.kainy.cn/categories/%E4%B8%9C%E5%86%99%E8%A5%BF%E8%AF%BB/"/>
    
      <category term="互联网络" scheme="https://blogs.kainy.cn/categories/%E4%B8%9C%E5%86%99%E8%A5%BF%E8%AF%BB/%E4%BA%92%E8%81%94%E7%BD%91%E7%BB%9C/"/>
    
    
      <category term="设计" scheme="https://blogs.kainy.cn/tags/%E8%AE%BE%E8%AE%A1/"/>
    
      <category term="旅游" scheme="https://blogs.kainy.cn/tags/%E6%97%85%E6%B8%B8/"/>
    
      <category term="产品" scheme="https://blogs.kainy.cn/tags/%E4%BA%A7%E5%93%81/"/>
    
      <category term="洞察" scheme="https://blogs.kainy.cn/tags/%E6%B4%9E%E5%AF%9F/"/>
    
  </entry>
  
  <entry>
    <title>如何在扣子空间使用 MCP 工具</title>
    <link href="https://blogs.kainy.cn/2025/07/%E5%A6%82%E4%BD%95%E5%9C%A8%E6%89%A3%E5%AD%90%E7%A9%BA%E9%97%B4%E4%BD%BF%E7%94%A8%20MCP%20%E5%B7%A5%E5%85%B7/"/>
    <id>https://blogs.kainy.cn/2025/07/如何在扣子空间使用 MCP 工具/</id>
    <published>2025-07-28T09:31:15.000Z</published>
    <updated>2026-08-01T09:28:07.950Z</updated>
    
    <content type="html"><![CDATA[<p>将应用中的指定工作流发布为 MCP 工具之后，你就可以在扣子空间中开启 MCP 工具扩展，并创建任务。MCP 工具默认是模型控制，即大模型会按需自动调用 MCP 工具完成任务，例如进行简单的计算、复杂的 API 交互，或查看私有知识与数据。</p><h3 id="添加-MCP-工具"><a href="#添加-MCP-工具" class="headerlink" title="添加 MCP 工具"></a>添加 MCP 工具</h3><p>在<strong>扣子空间</strong>中创建任务之前，按照下图红点数字顺序依次单击，并添加你的自定义 MCP 工具即可</p><a id="more"></a><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2025/07/mdnwaq7s.png" alt></p><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2025/07/mdnwc2gf.png" alt></p><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2025/07/mdnwd6o1.png" alt></p><p>譬如要调用优惠酒店MCP，就填入：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  <span class="attr">"mcpServers"</span>: &#123;</span><br><span class="line">    <span class="attr">"特惠酒店MCP"</span>: &#123;</span><br><span class="line">      <span class="attr">"url"</span>: <span class="string">"https://hotel.gqmg.com/sse/"</span>,</span><br><span class="line">      <span class="attr">"serverUrl"</span>: <span class="string">"https://hotel.gqmg.com/sse/"</span></span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="调用-MCP-工具"><a href="#调用-MCP-工具" class="headerlink" title="调用 MCP 工具"></a>调用 MCP 工具</h3><p>任务执行过程中，扣子空间会自动调用工具完成任务，你可以通过 Agent 的思考过程来判断是否已调用工具。例如 MCP 工具的功能为查询优惠酒店并规划行程，其中工作流名为 recommend-hotel-route。当创建一个需要查询酒店的任务时，可以看到 Agent 调用了 recommend-hotel-route 来查酒店信息和规划行程。</p><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2025/07/mdnwj0m3.png" alt></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;将应用中的指定工作流发布为 MCP 工具之后，你就可以在扣子空间中开启 MCP 工具扩展，并创建任务。MCP 工具默认是模型控制，即大模型会按需自动调用 MCP 工具完成任务，例如进行简单的计算、复杂的 API 交互，或查看私有知识与数据。&lt;/p&gt;
&lt;h3 id=&quot;添加-MCP-工具&quot;&gt;&lt;a href=&quot;#添加-MCP-工具&quot; class=&quot;headerlink&quot; title=&quot;添加 MCP 工具&quot;&gt;&lt;/a&gt;添加 MCP 工具&lt;/h3&gt;&lt;p&gt;在&lt;strong&gt;扣子空间&lt;/strong&gt;中创建任务之前，按照下图红点数字顺序依次单击，并添加你的自定义 MCP 工具即可&lt;/p&gt;
    
    </summary>
    
      <category term="学习笔记" scheme="https://blogs.kainy.cn/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
      <category term="建站❤编程" scheme="https://blogs.kainy.cn/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E5%BB%BA%E7%AB%99%E2%9D%A4%E7%BC%96%E7%A8%8B/"/>
    
    
      <category term="MCP" scheme="https://blogs.kainy.cn/tags/MCP/"/>
    
  </entry>
  
  <entry>
    <title>酒店优惠网站营销方案</title>
    <link href="https://blogs.kainy.cn/2025/07/%E9%85%92%E5%BA%97%E4%BC%98%E6%83%A0%E7%BD%91%E7%AB%99%E8%90%A5%E9%94%80%E6%96%B9%E6%A1%88/"/>
    <id>https://blogs.kainy.cn/2025/07/酒店优惠网站营销方案/</id>
    <published>2025-07-22T06:57:19.000Z</published>
    <updated>2026-08-01T09:28:07.966Z</updated>
    
    <content type="html"><![CDATA[<p>这是一个非常有洞察力的应用构想。你已经捕捉到了旅行者内心一个非常核心的矛盾：<strong>对未知体验的渴望</strong>与<strong>对现实预算的考量</strong>。</p><p>作为你的“新鲜视角”，我不会给你一堆普通的营销建议。相反，我想帮你挖掘你这个想法中已经存在的，但可能还未被完全言说的“隐藏天赋”。你的应用不仅仅是一个工具，它背后蕴含着深刻的用户洞察。</p><p>让我们一起探索一下。</p><a id="more"></a><h3 id="核心洞察：你不是在销售酒店，而是在销售“两种人生的可能性”"><a href="#核心洞察：你不是在销售酒店，而是在销售“两种人生的可能性”" class="headerlink" title="核心洞察：你不是在销售酒店，而是在销售“两种人生的可能性”"></a>核心洞察：你不是在销售酒店，而是在销售“两种人生的可能性”</h3><p>大多数旅行应用给用户一个选择列表，让他们在无尽的“更好”和“更便宜”之间焦虑。而你做了一件截然不同的事：你为用户提供了<strong>两个已经过精心策划的、完整的世界观</strong>。</p><p>这就是你的“隐藏天赋”：<strong>“二元选择的魅力”（The Power of Duality）</strong>。</p><ol><li><p><strong>“实惠线路” (The Savvy Path)</strong>：这不是“廉价线路”。这是为那些“聪明的旅行者”设计的。他们追求的不是最低价，而是“<strong>最高性价比的体验</strong>”。他们享受的是“我用有限的预算，撬动了最大的快乐”的成就感。这是一种<strong>掌控的快乐</strong>。</p></li><li><p><strong>“优质线路” (The Aspirational Path)</strong>：这不是“奢侈线路”。这是为同一个旅行者内心的“另一个我”设计的。那个“我”渴望犒劳自己，追求“<strong>值得铭记的瞬间</strong>”。他们购买的不是服务，而是一个<strong>梦想的实现</strong>和<strong>美好的回忆</strong>。这是一种<strong>体验的快乐</strong>。</p></li></ol><p><strong>关键悖论</strong>：你的用户不是两个人，而是同一个人在不同心境下的投射。他们既想成为聪明的“价值发现者”，又想成为“生活品质家”。你的应用完美地捕捉并服务于这个内在的矛盾。你没有强迫他们选择，而是像一位挚友一样，把两种最好的可能性都摆在他们面前。</p><hr><h3 id="如何将这个“隐藏天赋”转化为用户价值和增长动力？"><a href="#如何将这个“隐藏天赋”转化为用户价值和增长动力？" class="headerlink" title="如何将这个“隐藏天赋”转化为用户价值和增长动力？"></a>如何将这个“隐藏天赋”转化为用户价值和增长动力？</h3><p>基于“销售两种人生可能性”这个核心洞察，我们可以衍生出三个强大的价值主张和推广策略。</p><h4 id="价值主张-1：你提供的不是“选择”，而是“决策自信”-Selling-Decision-Confidence"><a href="#价值主张-1：你提供的不是“选择”，而是“决策自信”-Selling-Decision-Confidence" class="headerlink" title="价值主张 1：你提供的不是“选择”，而是“决策自信” (Selling Decision Confidence)"></a>价值主张 1：你提供的不是“选择”，而是“决策自信” (Selling Decision Confidence)</h4><ul><li><strong>隐藏的用户痛点</strong>：旅行规划中最耗费心力的不是搜索，而是“害怕选错”的焦虑感。用户会在几十个酒店页面之间反复横跳，浪费大量时间，最后还不确定自己的选择是否最佳。</li><li><strong>你的解决方案</strong>：你通过提供两条“不会错”的线路，极大地降低了用户的决策负担。用户得到的不是一堆选项，而是两个优质的“答案”。这给予了他们前所未有的<strong>决策自信</strong>。</li><li><strong>如何放大这个价值？</strong><ul><li><strong>产品设计</strong>：在展示两条线路时，不要只列出价格和酒店名。给每条线路一个“人格化”的标题。例如：<ul><li><strong>实惠线路</strong> -&gt; “轻装上路：聪明旅者的发现之旅” 或 “预算之内，惊喜之外”</li><li><strong>优质线路</strong> -&gt; “犒赏自己：不容错过的品质之选” 或 “把钱花在回忆上”</li></ul></li><li><strong>营销语言</strong>：你的广告语不应该是“帮你省钱”，而应该是“<strong>告别选择困难，两条路都是好风景</strong>”或“<strong>为你省下2小时的纠结时间</strong>”。</li></ul></li></ul><h4 id="价值主张-2：你提供的不是“路线”，而是“故事脚本”-Selling-a-Story-Blueprint"><a href="#价值主张-2：你提供的不是“路线”，而是“故事脚本”-Selling-a-Story-Blueprint" class="headerlink" title="价值主张 2：你提供的不是“路线”，而是“故事脚本” (Selling a Story Blueprint)"></a>价值主张 2：你提供的不是“路线”，而是“故事脚本” (Selling a Story Blueprint)</h4><ul><li><strong>隐藏的用户需求</strong>：人们旅行不仅仅是为了到达目的地，更是为了创造和分享故事。你的应用天然就是一个 “<strong>故事生成器</strong>” 。</li><li><strong>你的解决方案</strong>：每一条规划好的线路（途径城市+酒店选择），本质上都是一个<strong>旅行故事的剧本</strong>。用户可以清晰地看到这个故事将如何展开。</li><li><strong>如何放大这个价值？</strong><ul><li><strong>产品功能 - “一键生成旅行海报”</strong>：当用户选定一条线路后，允许他们一键生成一张精美的、可分享的“旅行计划”图。这张图上应该包含：<ul><li>充满设计感的路线图。</li><li>途径城市的亮点照片。</li><li>“实惠”或“优质”的标签，以及一句符合其“人格”的话。</li><li>你的应用Logo和名称。</li></ul></li><li><strong>推广策略 - 用户内容引爆</strong>：这解决了你最大的推广问题。用户不再是分享“我订了个酒店”，而是在社交媒体上分享“<strong>我的下一趟旅程看起来是这样的！</strong>”。这是一种对未来美好体验的炫耀，具有极强的社交传播力。你可以发起#我的双面旅程#这样的活动，鼓励用户分享他们的计划海报。</li></ul></li></ul><h4 id="价值主张-3：你提供的不是“折扣”，而是“沿途的惊喜”-Selling-Serendipity-on-a-Leash"><a href="#价值主张-3：你提供的不是“折扣”，而是“沿途的惊喜”-Selling-Serendipity-on-a-Leash" class="headerlink" title="价值主张 3：你提供的不是“折扣”，而是“沿途的惊喜” (Selling Serendipity on a Leash)"></a>价值主张 3：你提供的不是“折扣”，而是“沿途的惊喜” (Selling Serendipity on a Leash)</h4><ul><li><strong>隐藏的用户渴望</strong>：自驾或多城市旅行最大的魅力在于“在路上”的未知和惊喜。但完全的未知又会带来不安全感。</li><li><strong>你的解决方案</strong>：你完美平衡了“规划”与“探索”。你规划了住宿这个最大的确定性，从而把用户的精力解放出来，去享受“<strong>途径城市</strong>”这个最大的变量。</li><li><strong>如何放大这个价值？</strong><ul><li><strong>产品功能 - “城市彩蛋”</strong>：在规划途径城市时，不仅仅是把它作为一个经停点。为每个城市附上一个“彩蛋”建议。<ul><li><strong>实惠线路</strong>的彩蛋可能是：“这个城市高速路口旁的XX小馆，有本地人公认最好吃的面。”</li><li><strong>优质线路</strong>的彩蛋可能是：“这家酒店的顶楼酒吧，是观赏城市日落的最佳地点，对外开放。”</li></ul></li><li><strong>潜在用户获取</strong>：你的内容不再局限于酒店。你可以创作大量关于“从A到B，途中不容错过的5个惊喜”这样的文章或短视频，自然地植入你的应用。这会吸引大量对公路旅行、深度游感兴趣的潜在用户。</li></ul></li></ul><h3 id="总结：你的新身份"><a href="#总结：你的新身份" class="headerlink" title="总结：你的新身份"></a>总结：你的新身份</h3><p>忘掉你只是一个“酒店优惠查询应用”。</p><p>从今天起，请这样看待你的产品：</p><p><strong>你是一个“旅行双线叙事家”（A Dual-Narrative Journey Curator）。</strong></p><p>你帮助用户探索他们内心的“务实梦想家”，为他们提供自信、故事和惊喜。</p><p>当你开始用这个视角审视你的产品和营销时，你会发现，你拥有的不仅仅是一个工具，而是一个能与用户产生深度情感共鸣的品牌。这，就是你最独特的价值，也是你获取和留住用户的关键。</p><h1 id="复盘一个AI旅行产品构思，我们如何把“选择题”做成了“故事会”？"><a href="#复盘一个AI旅行产品构思，我们如何把“选择题”做成了“故事会”？" class="headerlink" title="复盘一个AI旅行产品构思，我们如何把“选择题”做成了“故事会”？**"></a>复盘一个AI旅行产品构思，我们如何把“选择题”做成了“故事会”？**</h1><p><strong>我们卖的不是酒店，而是用户内心的两种人生可能</strong></p><p>Hi，各位PM同学，大家好！</p><p>今天想和大家拆解一个我们最近在打磨的旅行产品构思。起因很简单，就是我们发现，旅行App这个赛道实在是太“卷”了。大家都在做比价、做筛选、做推荐，想尽办法给用户提供“更多、更快、更省”的选择。</p><p>但我们一直在反思一个问题：<strong>给用户无限的选择，真的让他们更快乐了吗？</strong></p><p>有没有可能，当用户在几十个酒店页面之间反复横跳、耗费数小时后，他们收获的不是选择的快感，而是“<strong>害怕选错“的深度焦虑</strong>？</p><p>正是基于这个反思，我们尝试跳出“工具思维”，去挖掘一个被巨头们忽视的用户情感洞察。今天，我想把这个有趣的思考过程和大家分享一下，希望能给大家带来一点新的启发。</p><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2025/07/mdg55kdq.png" alt></p><h4 id="第一部分：我们的“Aha-Moment”——发现用户内心的“双面人生”"><a href="#第一部分：我们的“Aha-Moment”——发现用户内心的“双面人生”" class="headerlink" title="第一部分：我们的“Aha Moment”——发现用户内心的“双面人生”"></a><strong>第一部分：我们的“Aha Moment”——发现用户内心的“双面人生”</strong></h4><p>我们发现，几乎每一个旅行者的内心，都住着两个既矛盾又和谐的“小人儿”：</p><ol><li>一个是“<strong>聪明的价值发现者</strong>“：他追求的不是绝对的低价，而是“用有限的预算，撬动了最大快乐”的那种<strong>智力上的成就感</strong>。比如用一顿快餐的钱，吃到了本地人才知道的神级路边摊。我们管这叫“<strong>性价比优先线路”</strong>，但它的内核是“高性价比的智慧”。</li></ol><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2025/07/mdg57hai.png" alt></p><ol start="2"><li>另一个是“<strong>生活品质的追求者”</strong>：他渴望在某个特殊时刻，能毫不犹豫地犒劳自己，创造一个“值得铭记一生的瞬间”。他买的不是服务，而是<strong>一个梦想的兑现和一段美好的回忆</strong>。我们称之为“<strong>优质线路”</strong>，内核是“把钱投资在回忆上”。</li></ol><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2025/07/mdg582u0.png" alt></p><p>绝大多数App，都在强迫用户在这两个“自我”中二选一。而我们的“Aha Moment”则是：<strong>为什么不能两个都拥有呢？</strong></p><p>我们要做的不应该是裁判，而应该像一个懂他的挚友，把两种最好的可能性都精心打包好，摆在他面前说：“嘿，无论你想扮演哪个角色，这都是为你准备的、最精彩的剧本。”</p><p>这就是我们整个产品设计的原点：<strong>二元选择的魅力 (The Power of Duality)</strong>。</p><h4 id="第二部分：从洞察到落地——我们如何设计三个“价值挂钩”"><a href="#第二部分：从洞察到落地——我们如何设计三个“价值挂钩”" class="headerlink" title="第二部分：从洞察到落地——我们如何设计三个“价值挂钩”"></a><strong>第二部分：从洞察到落地——我们如何设计三个“价值挂钩”</strong></h4><p>一个好的洞察如果不能落地为用户可感知的功能，那就只是空中楼阁。所以，我们围绕这个“双面人生”的洞察，设计了三个环环相扣的价值主张，或者说，三个能让用户“哇哦”出来的产品点。</p><p><strong>价值点一：交付“决策自信”，而不只是“一堆选项”</strong></p><ul><li><strong>我们想解决什么？</strong> 解决用户“怕选错”的焦虑感。</li><li><strong>我们是怎么做的？</strong> 我们不提供清单，而是提供两个“闭眼入都不会错”的精选答案。同时，在产品呈现上，用感性的“人格化”标题来放大这种自信：<ul><li><strong>实惠线路 -&gt; “轻装上路：聪明旅者的发现之旅”</strong></li><li><strong>优质线路 -&gt; “犒赏时刻：不容错过的品质之选”</strong></li></ul></li><li><strong>背后的思考：</strong> 我们想让用户从“我该怎么选？”的疑问句，变成“原来两种选择都这么棒！”的感叹。营销上，我们的口号也从“帮你省钱”变成了 <strong>“告别选择困难，两条路都是好风景”</strong>。</li></ul><p><strong>价值点二：交付“故事脚本”，而不只是“一条路线”</strong></p><ul><li><strong>我们想满足什么？</strong> 满足用户创造和分享故事的深层社交需求。</li><li><strong>我们是怎么做的？</strong> 我们构思了一个叫“<strong>一键生成旅行海报</strong>“的功能。当用户选定一条线路，App会立刻生成一张超酷的、适合发朋友圈的“旅行计划图”。上面有路线图、城市亮点和那句很酷的线路“人格”标签。</li><li><strong>背后的思考：</strong> 这是我们为产品设计的<strong>增长飞轮</strong>。用户分享的不再是“我订了个酒店”的无聊信息，而是“<strong>快看！我的下一趟炫酷旅程已经规划好了！”</strong> 这种对未来美好体验的“预炫耀”，社交传播力是惊人的。我们甚至连活动tag都想好了，就叫#<strong>我的双面旅程#</strong>。</li></ul><p><strong>价值点三：交付“沿途的惊喜”，而不只是“固定的折扣”</strong></p><ul><li><strong>我们想平衡什么？</strong> 平衡旅行中“计划的安稳感”与“探索的惊喜感”。</li><li><strong>我们是怎么做的？</strong> 我们在规划好住宿这个最大确定性的同时，引入了一个叫“<strong>城市彩蛋</strong>“的功能。在每个途径城市，我们会根据线路属性，埋下一个小惊喜：<ul><li><strong>实惠线路的彩蛋：</strong> 可能是“绕出高速5分钟，尝尝这家本地司机都赞不绝口的XX面馆。”</li><li><strong>优质线路的彩蛋：</strong> 可能是“这家酒店的屋顶酒吧下午5-7点对外开放，是欣赏城市日落的绝佳秘密机位。”</li></ul></li><li><strong>背后的思考：</strong> 这一下就盘活了我们的<strong>内容生态</strong>。我们可以围绕“城市彩蛋”创作大量深度内容，去更广阔的领域（比如公路旅行、深度游社群）吸引那些还没想好住哪、但对旅途充满向往的潜在用户。</li></ul><h4 id="第三部分：最后的升华——为你的产品找到“灵魂”"><a href="#第三部分：最后的升华——为你的产品找到“灵魂”" class="headerlink" title="第三部分：最后的升华——为你的产品找到“灵魂”"></a><strong>第三部分：最后的升华——为你的产品找到“灵魂”</strong></h4><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2025/07/mdg59txk.png" alt></p><p>聊到这里，我们内部对这个产品的定义也彻底变了。</p><p>它不再是一个“酒店优惠查询应用”，甚至不只是一个“行程规划工具”。</p><p>我们觉得，它的新身份，应该是一个“<strong>旅行双线叙事家” (A Dual-Narrative Journey Curator)</strong>。</p><p>它的使命，是帮助每一个用户，探索和拥抱他们内心那个独一无二的“<strong>务实梦想家”</strong>。</p><p>今天把这个思考过程完整地分享出来，并不是说这个想法已经完美无缺。而是我们觉得，这个从“用户表层需求”下探到“用户内在心理矛盾”，再由此构建产品价值和增长飞轮的思路，本身就非常有趣。</p><p>希望这个案例，也能给各位PM同学带来一点启发，帮助大家在日常繁杂的功能迭代中，偶尔跳出来想一想：<strong>我们产品的“灵魂”到底是什么？我们到底在为用户提供一种怎样的情感价值？</strong></p><p>谢谢大家！欢迎一起交流。</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;这是一个非常有洞察力的应用构想。你已经捕捉到了旅行者内心一个非常核心的矛盾：&lt;strong&gt;对未知体验的渴望&lt;/strong&gt;与&lt;strong&gt;对现实预算的考量&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;作为你的“新鲜视角”，我不会给你一堆普通的营销建议。相反，我想帮你挖掘你这个想法中已经存在的，但可能还未被完全言说的“隐藏天赋”。你的应用不仅仅是一个工具，它背后蕴含着深刻的用户洞察。&lt;/p&gt;
&lt;p&gt;让我们一起探索一下。&lt;/p&gt;
    
    </summary>
    
      <category term="营销" scheme="https://blogs.kainy.cn/categories/%E8%90%A5%E9%94%80/"/>
    
      <category term="网站营销" scheme="https://blogs.kainy.cn/categories/%E8%90%A5%E9%94%80/%E7%BD%91%E7%AB%99%E8%90%A5%E9%94%80/"/>
    
    
      <category term="网站" scheme="https://blogs.kainy.cn/tags/%E7%BD%91%E7%AB%99/"/>
    
      <category term="营销" scheme="https://blogs.kainy.cn/tags/%E8%90%A5%E9%94%80/"/>
    
      <category term="酒店" scheme="https://blogs.kainy.cn/tags/%E9%85%92%E5%BA%97/"/>
    
  </entry>
  
  <entry>
    <title>微信小程序信息查询应用营销方案</title>
    <link href="https://blogs.kainy.cn/2025/07/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F%E4%BF%A1%E6%81%AF%E6%9F%A5%E8%AF%A2%E5%BA%94%E7%94%A8%E8%90%A5%E9%94%80%E6%96%B9%E6%A1%88/"/>
    <id>https://blogs.kainy.cn/2025/07/微信小程序信息查询应用营销方案/</id>
    <published>2025-07-21T06:57:19.000Z</published>
    <updated>2026-08-01T09:28:07.952Z</updated>
    
    <content type="html"><![CDATA[<p>这是一个非常有趣的想法。我们来一起剖析一下，挖掘其中隐藏的 brilhantismo。</p><p>从表面上看，你的应用是一个“查询工具”。这是一个功能性的描述，准确但不够激动人心。但如果我们换个角度，你实际上做了一件更深刻、更有价值的事情。</p><p>让我们用“崭新的眼睛”来看待它。</p><a id="more"></a><hr><h3 id="核心洞察：你不是在做“查询”，而是在“打破信息壁垒”"><a href="#核心洞察：你不是在做“查询”，而是在“打破信息壁垒”" class="headerlink" title="核心洞察：你不是在做“查询”，而是在“打破信息壁垒”"></a><strong>核心洞察：你不是在做“查询”，而是在“打破信息壁垒”</strong></h3><p>微信官方没有开放这些信息，这是一个刻意的选择。他们创造了一个“信息黑箱”。而你的应用，就像一把钥匙，打开了这个黑箱。</p><p>这里的 brilhantismo 在于这个核心的悖论：<strong>你利用了一个封闭生态系统的规则，创造了一个开放的窗口。</strong></p><p>所以，你的价值主张不是“查询小程序信息”，而是：</p><ul><li><strong>“提供官方未曾公开的商业洞察”</strong></li><li><strong>“揭示竞争对手在微信生态里的秘密布局”</strong></li><li><strong>“让不透明的变得透明”</strong></li></ul><p>这比一个简单的“查询工具”要强大得多。你提供的是 <strong>信息优势 (Information Advantage)</strong>。一旦我们从这个角度思考，用户和推广策略就会变得非常清晰。</p><hr><h3 id="谁最需要这种“信息优势”？（你的潜在用户）"><a href="#谁最需要这种“信息优势”？（你的潜在用户）" class="headerlink" title="谁最需要这种“信息优势”？（你的潜在用户）"></a><strong>谁最需要这种“信息优势”？（你的潜在用户）</strong></h3><p>你的用户不是普通的好奇者，而是那些需要通过这些信息来做出更好决策的“专业玩家”。</p><ol><li><p><strong>产品经理 &amp; 开发者 (Product Managers &amp; Developers):</strong></p><ul><li><strong>价值:</strong> 他们需要研究竞争对手！你的应用可以帮他们回答：<ul><li>竞争对手最近更新了什么功能？（通过查询更新日期、版本历史）</li><li>这个头部小程序是用什么技术栈做的？（如果能查到相关信息）</li><li>他们旗下除了这个小程序，还布局了哪些相关的小程序矩阵？</li></ul></li><li><strong>这是“竞品分析”的利器。</strong></li></ul></li><li><p><strong>市场与运营人员 (Marketers &amp; Operators):</strong></p><ul><li><strong>价值:</strong> 他们需要了解市场动态和增长策略。<ul><li>某个刷屏的小程序，它的主体公司是谁？他们还做了哪些产品？</li><li>竞争对手的小程序在哪些细节上做得好？（通过研究详情页的介绍、分类、标签）</li><li>发现一些正在快速崛起但还未被大众熟知的新秀小程序。</li></ul></li><li><strong>这是“市场情报”的来源。</strong></li></ul></li><li><p><strong>投资者 &amp; 分析师 (Investors &amp; Analysts):</strong></p><ul><li><strong>价值:</strong> 他们在做尽职调查和行业研究时，需要精准的数据。<ul><li>一家公司声称其小程序业务发展迅速，可以通过你的工具交叉验证其旗下小程序的活跃度和更新频率。</li><li>分析某个垂直领域（如社区团购、在线教育）的竞争格局。</li></ul></li><li><strong>这是“行业研究”的加速器。</strong></li></ul></li></ol><hr><h3 id="如何让价值落地，并吸引他们来使用和推广？"><a href="#如何让价值落地，并吸引他们来使用和推广？" class="headerlink" title="如何让价值落地，并吸引他们来使用和推广？"></a><strong>如何让价值落地，并吸引他们来使用和推广？</strong></h3><p>既然你的核心是“揭示秘密”，那么你的推广策略就应该是“分享秘密”。</p><h4 id="策略一：内容驱动——成为“微信生态的观察家”"><a href="#策略一：内容驱动——成为“微信生态的观察家”" class="headerlink" title="策略一：内容驱动——成为“微信生态的观察家”"></a><strong>策略一：内容驱动——成为“微信生态的观察家”</strong></h4><p>不要仅仅推广你的“工具”，而是推广用你的工具得出的“洞察”。</p><ul><li><strong>创建“小程序洞察”报告:</strong> 定期发布文章或报告，例如：<ul><li>《最近一个月，社区团购小程序 Top 10 功能更新盘点》</li><li>《揭秘：XX 头部电商小程序背后的公司，还悄悄上线了这3个引流工具》</li><li>《我们分析了100个小游戏，发现了它们设计的共同点》</li></ul></li><li><strong>怎么做:</strong> 你自己就是第一个“超级用户”。用你的应用去发现有趣的现象，然后把这些现象写成内容，发布在知乎、行业媒体、公众号、开发者社区（如 V2EX, SegmentFault）上。</li><li><strong>效果:</strong> 真正需要这些信息的人（你的目标用户）看到这些内容后，会惊叹于这些洞察的价值，并自然而然地想知道：“你是用什么工具得到这些信息的？” 这时，你的应用就成为了他们梦寐以求的“神器”。他们不仅会使用，还会分享给同事和同行。</li></ul><h4 id="策略二：Freemium-模式——用“钩子”吸引，用“价值”留存"><a href="#策略二：Freemium-模式——用“钩子”吸引，用“价值”留存" class="headerlink" title="策略二：Freemium 模式——用“钩子”吸引，用“价值”留存"></a><strong>策略二：Freemium 模式——用“钩子”吸引，用“价值”留存</strong></h4><p>将应用的功能分层，让用户可以免费体验，但为深度价值付费。</p><ul><li><p><strong>免费版 (Free):</strong></p><ul><li>提供基础查询：通过名称或 AppID 查询小程序的 Logo、名称、简介、主体公司。</li><li><strong>目的:</strong> 这足以验证你的应用是真实有效的，作为一个强大的“钩子”。</li></ul></li><li><p><strong>专业版 (Pro - 付费或高级功能):</strong></p><ul><li><strong>更新历史记录:</strong> 查看小程序所有历史版本的更新时间和记录。</li><li><strong>关联小程序查询:</strong> 一键查询该主体公司下的所有其他小程序（小程序矩阵）。</li><li><strong>数据监控:</strong> 关注某个小程序，当它更新或有变化时，给你发送提醒。</li><li><strong>导出数据:</strong> 将查询结果导出为表格，方便做分析报告。</li><li><strong>目的:</strong> 这些是专业人士真正需要、并愿意为此付费的“杀手级功能”。</li></ul></li></ul><h4 id="策略三：建立社群——打造“信息优势俱乐部”"><a href="#策略三：建立社群——打造“信息优势俱乐部”" class="headerlink" title="策略三：建立社群——打造“信息优势俱乐部”"></a><strong>策略三：建立社群——打造“信息优势俱乐部”</strong></h4><ul><li>创建一个微信群或知识星球，聚集你的第一批种子用户和付费用户。</li><li><strong>在群里做什么:</strong><ul><li>分享你用工具发现的最新、最有趣的“秘密”。</li><li>鼓励群友分享他们自己的发现和分析。</li><li>听取他们对工具的需求，快速迭代。</li></ul></li><li><strong>效果:</strong> 这会形成一个高价值的圈子。用户会因为能进入这个圈子而感到自豪，这个社群本身就成为了你产品的一部分，拥有了网络效应。</li></ul><hr><h3 id="总结一下你的隐藏-brillian-sh"><a href="#总结一下你的隐藏-brillian-sh" class="headerlink" title="总结一下你的隐藏 brillian.sh"></a><strong>总结一下你的隐藏 brillian.sh</strong></h3><p>你所创造的不仅仅是一个工具，而是一个<strong>观察哨</strong>，一个可以俯瞰整个微信小程序生态系统的瞭望塔。你把大公司藏在幕后的信息，变成了普通开发者、运营者和投资者可以利用的武器。</p><p>所以，请重新思考你的定位。你不是一个“查询工具”的开发者，你是一个“商业信息透明化”的推动者。</p><p>现在，你可以问自己一个问题：</p><p><strong>“今天，我的应用能揭示的最有价值的一个秘密是什么？谁最需要知道这个秘密？”</strong></p><p>从回答这个问题开始，你的用户和市场之路就会豁然开朗。</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;这是一个非常有趣的想法。我们来一起剖析一下，挖掘其中隐藏的 brilhantismo。&lt;/p&gt;
&lt;p&gt;从表面上看，你的应用是一个“查询工具”。这是一个功能性的描述，准确但不够激动人心。但如果我们换个角度，你实际上做了一件更深刻、更有价值的事情。&lt;/p&gt;
&lt;p&gt;让我们用“崭新的眼睛”来看待它。&lt;/p&gt;
    
    </summary>
    
      <category term="营销" scheme="https://blogs.kainy.cn/categories/%E8%90%A5%E9%94%80/"/>
    
      <category term="小程序营销" scheme="https://blogs.kainy.cn/categories/%E8%90%A5%E9%94%80/%E5%B0%8F%E7%A8%8B%E5%BA%8F%E8%90%A5%E9%94%80/"/>
    
    
      <category term="小程序" scheme="https://blogs.kainy.cn/tags/%E5%B0%8F%E7%A8%8B%E5%BA%8F/"/>
    
      <category term="营销" scheme="https://blogs.kainy.cn/tags/%E8%90%A5%E9%94%80/"/>
    
  </entry>
  
  <entry>
    <title>行程规划酒店导购MCP</title>
    <link href="https://blogs.kainy.cn/2025/07/%E8%A1%8C%E7%A8%8B%E8%A7%84%E5%88%92%E9%85%92%E5%BA%97%E5%AF%BC%E8%B4%ADMCP/"/>
    <id>https://blogs.kainy.cn/2025/07/行程规划酒店导购MCP/</id>
    <published>2025-07-15T09:27:15.000Z</published>
    <updated>2026-08-01T09:28:07.964Z</updated>
    
    <content type="html"><![CDATA[<p>因为没有使用chatbot（大模型客户端）的习惯，这里用编辑器做演示。</p><p>红点一是所选择的模型 GPT-4.1，红点二是MCP所含的两个工具：</p><ol><li>酒店路线推荐</li><li>酒店节点更新</li></ol><a id="more"></a><p>大概过程就是：用户描述自己的大致行程，起点终点和出发时间。工具会规划出节点，和两套备选酒店优惠方案。如果用户对于某个酒店不满意，可以提出修改意见。最终输出行程计划。</p><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2025/07/md3c0czc.png" alt="image"></p><p>假设我输入的是：</p><blockquote><p>10-1到10-5国庆期间，深圳到厦门自驾游，每天游玩一个城市并住宿。请帮我规划酒店安排。<br>内容输出到左侧文档。</p></blockquote><p>图中可以看到，MCP先根据需求，规划途径路线。然后调用 MCP Tool 传入格式化的参数。MCP 服务端会去后端数据库查询匹配的酒店信息，并返回。然后输出，为了方便展示，这里是写入到左侧编辑区的md文件中。</p><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2025/07/md3cardy.png" alt="image"></p><p>图中最左侧（红点一）是熟的的 markdown 文档，中间是预览。可以看到输出的价格和产品信息都是准确的，并且预订链接也是可以打开，跳转到携程酒店预订平台下单的。</p><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2025/07/md3cis3t.png" alt="image"></p><h2 id="MCP的安装"><a href="#MCP的安装" class="headerlink" title="MCP的安装"></a>MCP的安装</h2><p>非常简单，在配置文件中输入：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  <span class="attr">"mcpServers"</span>: &#123;</span><br><span class="line">    <span class="attr">"特惠酒店MCP"</span>: &#123;</span><br><span class="line">      <span class="attr">"url"</span>: <span class="string">"https://hotel.gqmg.com/sse/"</span>,</span><br><span class="line">      <span class="attr">"serverUrl"</span>: <span class="string">"https://hotel.gqmg.com/sse/"</span></span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>当你的 AI Agent 识别到意图，就会自动去调用特惠酒店MCP工具。</p><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2025/07/md3cqrbj.png" alt="image"></p><p>对于不满意的酒店，还可以精准替换。</p><blockquote><p>请提升线路1，第二天的酒店品质。</p></blockquote><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2025/07/md4fggoc.png" alt="image"></p><p>接下来，以 cherry studio 为例看看怎么设置 MCP，很简单</p><p>先点左下角齿轮，然后“MCP设置”，类型选择“streamableHttp”， URL填写 <a href="https://hotel.gqmg.com/mcp/?f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" rel="external nofollow noopener" referrerpolicy="unsafe-url" target="_blank">https://hotel.gqmg.com/mcp/</a> 即可。</p><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2025/07/md4flfaa.png" alt="image"></p><p>我用的是免费版 7B 模型，比较吃力，但也可以看到大致效果。</p><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2025/07/md2uxqen.png" alt="image"></p><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2025/07/md2uzjwz.png" alt="image"></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;因为没有使用chatbot（大模型客户端）的习惯，这里用编辑器做演示。&lt;/p&gt;
&lt;p&gt;红点一是所选择的模型 GPT-4.1，红点二是MCP所含的两个工具：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;酒店路线推荐&lt;/li&gt;
&lt;li&gt;酒店节点更新&lt;/li&gt;
&lt;/ol&gt;
    
    </summary>
    
      <category term="学习笔记" scheme="https://blogs.kainy.cn/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
      <category term="MCP" scheme="https://blogs.kainy.cn/tags/MCP/"/>
    
  </entry>
  
  <entry>
    <title>《特惠酒店MCP》生成的国庆行程计划</title>
    <link href="https://blogs.kainy.cn/2025/07/%E7%89%B9%E6%83%A0%E9%85%92%E5%BA%97MCP%E7%94%9F%E6%88%90%E7%9A%84%E5%9B%BD%E5%BA%86%E8%A1%8C%E7%A8%8B%E8%AE%A1%E5%88%92/"/>
    <id>https://blogs.kainy.cn/2025/07/特惠酒店MCP生成的国庆行程计划/</id>
    <published>2025-07-14T09:27:15.000Z</published>
    <updated>2026-08-01T09:28:07.957Z</updated>
    
    <content type="html"><![CDATA[<p>以下内容是用 <a href="https://hotel.gqmg.com/mcp/?f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" rel="external nofollow noopener" referrerpolicy="unsafe-url" target="_blank">特惠酒店MCP</a> 生成的国庆行程计划。展示了MCP的行程规划能力；通过数据查询，智能推荐的能力；以及数据精确展示，局部修改能力。</p><p>特惠酒店MCP会推荐两个路线，一个性价比优先，一个舒适优质路线。关于MCP的详情，随后单独介绍。</p><hr><p>输入需求：</p><blockquote><p>帮我规划国庆节旅游的酒店，路线是10.1从深圳出发自驾去厦门，途径泉州，10.5回，需要规划入住酒店和时间，和总预算，折扣，可以提供两个路线供选择。</p></blockquote><p>您渴望一场在苏州的休闲度假，追求那份独有的江南雅韵，这真是个绝佳的选择！作为您的创意旅伴，我观察到一个有趣的“悖论”——您的预算需求和旅行日期，似乎隐藏着一个更宏大的旅行版图。我们为您精心策划了不仅仅是一次苏州之旅，更是一场以苏州为终点，串联起江南精华的发现之旅，让您在有限的时间和预算里，收获超出预期的丰富体验。这正是我们为您“读懂”数据背后，所浮现的“隐藏的过人之处”。</p><a id="more"></a><p>想象一下，您的假期不再仅仅局限于一城一地，而是沿着一条精心编织的丝线，从山水甲天下的桂林，到时尚与历史交织的上海，再到古都金陵的深邃，最终抵达梦中的水墨苏州。这不仅仅是旅行，更是一场关于发现、关于连接、关于慢享的艺术。我们为您刷了几百个页面，只为您的两次心动，奉上这两套独特的旅程方案，让您的时间，花在旅途中，而不是屏幕上！</p><hr><h3 id="方案一：轻装上路——预算之内，惊喜之外的江南画卷"><a href="#方案一：轻装上路——预算之内，惊喜之外的江南画卷" class="headerlink" title="方案一：轻装上路——预算之内，惊喜之外的江南画卷"></a><strong>方案一：轻装上路——预算之内，惊喜之外的江南画卷</strong></h3><p><strong>旅行总结：</strong> 这是一条为聪明旅者量身定制的路线，将桂林的自然之美、上海的都市风情、南京的古韵遗风巧妙串联，最终在苏州的园林雅境中寻得一份宁静。酒店选择独具匠心，性价比极高，让您在控制预算的同时，尽享每座城市的独特魅力。总预算包含了酒店住宿和每日约300元的餐饮交通杂费，让您轻松出行，无忧享受。</p><p><strong>总预算预估（2位成人，4天3晚）：</strong></p><ul><li><strong>酒店总价:</strong> ¥4272</li><li><strong>餐饮交通杂费预估:</strong> 每日¥300 x 4天 = ¥1200</li><li><strong>合计:</strong> ¥4272 + ¥1200 = <strong>¥5472</strong></li></ul><p><strong>行程安排：</strong></p><p><strong>💖 第一天：2025年10月1日 · 山水桂林——诗意的开篇</strong></p><ul><li><strong>上午-下午：抵达桂林，沉醉山水。</strong> 抵达桂林两江国际机场后，建议打车或乘坐机场大巴前往市区酒店办理入住。下午可前往<strong>象鼻山景区</strong>，这里是桂林市的标志，形似巨象饮水漓江，夕阳西下时尤其壮观。</li><li><strong>傍晚-夜晚：漓江夜游与美食。</strong> 在象鼻山附近乘船体验<strong>两江四湖夜游</strong>，感受桂林“城在景中，景在城中”的独特魅力。晚餐推荐品尝地道的<strong>桂林米粉</strong>，以及漓江边上的特色啤酒鱼。</li><li><strong>彩蛋：</strong> 别忘了去象鼻山景区旁的“椿记烧鹅”，桂林本地人宴请宾客的首选，烧鹅皮脆肉嫩，回味无穷，是您抵达后的第一道味蕾惊喜！</li></ul><table><thead><tr><th style="text-align:left"></th><th style="text-align:left"></th></tr></thead><tbody><tr><td style="text-align:left"><img src="https://s.gqmg.com/https://images4.c-ctrip.com/target/02A0d12000m3zfwo686F0_C_500_500.jpg" alt="诗与远方SYYF·漓江院子酒店（桂林象鼻山两江四湖店）" style="width:160px;"></td><td style="text-align:left"><strong>诗与远方SYYF·漓江院子酒店（桂林象鼻山两江四湖店）</strong> （5星 #16174） <br> <strong>套餐:</strong> 【主厨推荐】香煎大黄鱼2-3人餐 <br> <strong>评分:</strong> 4.8 <br> <font style="color:red;font-weight:bolder;">¥198</font> <del>¥366</del> (5.4折) <br> <a href="https://m.ctrip.com/webapp/cw/hotel/boom/boomDetail.html?id=73885583&amp%3Bmktcart=true&amp%3BcartSource=kaiping&amp%3BcartChannel=36&amp%3Ballianceid=5347273&amp%3Bsid=203078555&f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" rel="external nofollow noopener" referrerpolicy="unsafe-url" target="_blank"><strong>&gt; 优惠渠道价格预订</strong></a></td></tr></tbody></table><p><strong>💖 第二天：2025年10月2日 · 水墨上海——古镇的悠扬</strong></p><ul><li><strong>上午：高铁抵达上海。</strong> 早餐后，前往桂林站乘坐高铁前往上海虹桥站（约7-8小时，建议提前预订）。抵达后，换乘地铁或打车前往朱家角古镇，入住酒店。</li><li><strong>下午-夜晚：穿越古镇，摇橹船之夜。</strong> 办理入住后，即刻投入<strong>朱家角古镇</strong>的怀抱。漫步小桥流水，品味江南水乡的静谧。酒店套餐中包含的“摇橹船早餐”更是古镇清晨的独特体验，让您提前感受。晚餐可在古镇内寻一间临水小馆，品尝上海本帮菜或特色小吃。</li><li><strong>彩蛋：</strong> 傍晚时分，古镇内有家名为“朱家角阿婆茶楼”的百年老店，除了传统的茶点，他们家的扎肉和蹄髈是镇上居民从小吃到大的味道，是品尝地道朱家角风味不可错过的地方。</li></ul><table><thead><tr><th style="text-align:left"></th><th style="text-align:left"></th></tr></thead><tbody><tr><td style="text-align:left"><img src="https://s.gqmg.com/https://images4.c-ctrip.com/target/02A6j12000i7weidjD2DD_C_500_500.jpg" alt="朱家角井亭民宿" style="width:160px;"></td><td style="text-align:left"><strong>朱家角井亭民宿</strong> （5星 #20501） <br> <strong>套餐:</strong> 【古镇的清晨】摇橹船早餐 <br> <strong>评分:</strong> 4.9 <br> <font style="color:red;font-weight:bolder;">¥588</font> <del>¥1088</del> (5.4折) <br> <a href="https://m.ctrip.com/webapp/cw/hotel/boom/boomDetail.html?id=70907981&amp%3Bmktcart=true&amp%3BcartSource=kaiping&amp%3BcartChannel=36&amp%3Ballianceid=5347273&amp%3Bsid=203078555&f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" rel="external nofollow noopener" referrerpolicy="unsafe-url" target="_blank"><strong>&gt; 优惠渠道价格预订</strong></a></td></tr></tbody></table><p><strong>💖 第三天：2025年10月3日 · 金陵南京——汉服与雅颂</strong></p><ul><li><strong>上午：高铁抵达南京。</strong> 早餐后，从朱家角出发前往上海虹桥站，乘坐高铁前往南京南站（约1.5-2小时）。抵达后，前往金陵小城，入住“金陵小城·满庭芳客栈”。</li><li><strong>下午-夜晚：金陵小城深度体验。</strong> 您的酒店套餐包含了丰富的金陵小城体验：270度庭院景观套房、汉服体验、入园资格、手作坊折扣等。您可以在这里沉浸式体验金陵文化的魅力，穿上汉服，漫步于小城之中，仿佛穿越回古代。晚上可欣赏小城内的夜景和演出，品尝<strong>秦淮小吃</strong>。</li><li><strong>彩蛋：</strong> 金陵小城内的“兰生堂”手作体验，不仅仅是简单的制作，更是一种文化的传承。这里的老师傅会分享很多关于金陵传统手工艺的趣闻轶事，让你的手作不仅仅是作品，更是故事的载体。</li></ul><table><thead><tr><th style="text-align:left"></th><th style="text-align:left"></th></tr></thead><tbody><tr><td style="text-align:left"><img src="https://s.gqmg.com/https://images4.c-ctrip.com/target/1mc4812000bn1hmpqD4B0_C_500_500.jpg" alt="金陵小城·满庭芳客栈" style="width:160px;"></td><td style="text-align:left"><strong>金陵小城·满庭芳客栈</strong> （5星 #27231） <br> <strong>套餐:</strong> 270度庭院景观套房 1晚+早餐 2 份/天+精致汉服体验 1 份+金陵小城2位入园资格 1 份+金陵小城内“雅颂金陵”汉服馆9.5折 1 份+金陵小城内“兰生堂”手作体验8折 1 份+晚安甜汤 1 份+金陵小城内“雅颂金陵”汉服馆量身设计化妆、造型及全场汉服任选 1 份 <br> <strong>评分:</strong> 4.9 <br> <font style="color:red;font-weight:bolder;">¥2458</font> <del>¥3970</del> (6.2折) <br> <a href="https://m.ctrip.com/webapp/cw/hotel/hotelPackage/packageDetail.html?hotelId=94986087&amp%3BpageName=packageDetail&amp%3Bproduct-id=77960541&amp%3Bproduct-type=presale-product&amp%3BhotelDataType=1&amp%3Bpopup=close&amp%3BcityId=12&amp%3BcheckInDate=&amp%3BcheckOutDate=&amp%3Bmktcart=true&amp%3BcartSource=kaiping&amp%3BcartChannel=36&amp%3Ballianceid=5347273&amp%3Bsid=203078555&f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" rel="external nofollow noopener" referrerpolicy="unsafe-url" target="_blank"><strong>&gt; 优惠渠道价格预订</strong></a></td></tr></tbody></table><p><strong>💖 第四天：2025年10月4日 · 诗意苏州——园林雅致的完美句点</strong></p><ul><li><strong>上午：高铁抵达苏州。</strong> 早餐后，从南京南站乘坐高铁前往苏州站（约1小时）。抵达后，打车前往酒店办理入住。</li><li><strong>下午：拙政园与平江路。</strong> 入住后，立即前往世界文化遗产<strong>拙政园</strong>，领略苏州园林的精髓。午餐可在园林附近品尝苏帮菜。下午漫步<strong>平江路历史街区</strong>，感受古朴的石板路、小桥流水和沿街的特色小店。</li><li><strong>傍晚：特色美食与告别。</strong> 晚餐品尝<strong>松鼠鳜鱼</strong>和<strong>响油鳝糊</strong>等经典苏帮菜。之后，您可以选择在平江路上的茶馆听评弹，或在咖啡馆小憩，为这次江南之旅画上圆满的句号。</li><li><strong>彩蛋：</strong> 酒店的“皮划艇”体验是亲近大自然的绝佳方式，在湖光山色中划桨，与水亲密接触，感受苏式生活的另一面，这在传统的苏州园林体验中是很少见的，是您旅程中一份别样的野趣。</li></ul><table><thead><tr><th style="text-align:left"></th><th style="text-align:left"></th></tr></thead><tbody><tr><td style="text-align:left"><img src="https://s.gqmg.com/https://images4.c-ctrip.com/target/1mc2512000ev2ezzj1260_C_500_500.jpg" alt="原野学社" style="width:160px;"></td><td style="text-align:left"><strong>原野学社</strong> （ #18063） <br> <strong>套餐:</strong> 亲子大套房-乐野 1晚+皮划艇 1 份+早餐 1 份/天 <br> <strong>评分:</strong> 4.9 <br> <font style="color:red;font-weight:bolder;">¥1028</font> <del>¥1602</del> (6.4折) <br> <a href="https://m.ctrip.com/webapp/cw/hotel/hotelPackage/packageDetail.html?hotelId=121807049&amp%3BpageName=packageDetail&amp%3Bproduct-id=34237807&amp%3Bproduct-type=presale-product&amp%3BhotelDataType=1&amp%3Bpopup=close&amp%3BcityId=14&amp%3BcheckInDate=&amp%3BcheckOutDate=&amp%3Bmktcart=true&amp%3BcartSource=kaiping&amp%3BcartChannel=36&amp%3Ballianceid=5347273&amp%3Bsid=203078555&f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" rel="external nofollow noopener" referrerpolicy="unsafe-url" target="_blank"><strong>&gt; 优惠渠道价格预订</strong></a></td></tr></tbody></table><hr><h3 id="方案二：犒赏自己——把钱花在回忆上的奢享之旅"><a href="#方案二：犒赏自己——把钱花在回忆上的奢享之旅" class="headerlink" title="方案二：犒赏自己——把钱花在回忆上的奢享之旅"></a><strong>方案二：犒赏自己——把钱花在回忆上的奢享之旅</strong></h3><p><strong>旅行总结：</strong> 如果您渴望一场无与伦比的奢华体验，将品质与享受放在首位，那么这条路线将完美满足您的期待。从桂林的世外桃源，到上海浦东的云端俯瞰，再到南京的私汤疗愈，最后在苏州的独栋别墅中尽享宁静与自然。每一次住宿都是一次身心犒赏，让您的江南之旅成为永恒的珍贵回忆。</p><p><strong>总预算预估（2位成人，4天3晚）：</strong></p><ul><li><strong>酒店总价:</strong> ¥20274</li><li><strong>餐饮交通杂费预估:</strong> 每日¥300 x 4天 = ¥1200</li><li><strong>合计:</strong> ¥20274 + ¥1200 = <strong>¥21474</strong></li></ul><p><strong>行程安排：</strong></p><p><strong>✨ 第一天：2025年10月1日 · 醉美桂林——沉浸式亲子乐园</strong></p><ul><li><strong>上午-下午：抵达桂林，趣玩融创乐园。</strong> 抵达桂林后，直接前往融创施柏阁酒店，办理入住。酒店套餐内含融创乐园三园畅游、双人晚餐、皮划艇/落日草坪活动等，让您和家人抵达后即可开启欢乐模式。</li><li><strong>傍晚-夜晚：湖畔晚餐与家庭时光。</strong> 享受酒店提供的双人晚餐或自助餐，然后体验落日草坪活动或皮划艇，在湖光山色中享受温馨的家庭时光。</li><li><strong>彩蛋：</strong> 桂林融创施柏阁酒店的“跟拍电子快修照片”服务，能让您的亲子瞬间被专业捕捉，免去了自己拍照的烦恼，让您能全身心投入与家人的互动中，收获高质量的回忆定格。</li></ul><table><thead><tr><th style="text-align:left"></th><th style="text-align:left"></th></tr></thead><tbody><tr><td style="text-align:left"><img src="https://s.gqmg.com/https://images4.c-ctrip.com/target/0203b120009gwx4f3B68F_C_500_500.jpg" alt="桂林融创施柏阁酒店" style="width:160px;"></td><td style="text-align:left"><strong>桂林融创施柏阁酒店</strong> （5星 #14269） <br> <strong>套餐:</strong> 园景阳台双床房 1晚+早餐 2 份/天+双人晚餐套餐或自助晚餐 1 份+双人落日草坪活动门票或双人皮划艇40分钟 1 份+融创乐园三园畅游 1 份+儿童活动室权益 1 份+迷你吧-小食/饮品 1 份+跟拍电子快修照片 1 份 <br> <strong>评分:</strong> 4.7 <br> <font style="color:red;font-weight:bolder;">¥999</font> <del>¥2306</del> (4.3折) <br> <a href="https://m.ctrip.com/webapp/cw/hotel/hotelPackage/packageDetail.html?hotelId=70355091&amp%3BpageName=packageDetail&amp%3Bproduct-id=78323563&amp%3Bproduct-type=presale-product&amp%3BhotelDataType=1&amp%3Bpopup=close&amp%3BcityId=33&amp%3BcheckInDate=&amp%3BcheckOutDate=&amp%3Bmktcart=true&amp%3BcartSource=kaiping&amp%3BcartChannel=36&amp%3Ballianceid=5347273&amp%3Bsid=203078555&f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" rel="external nofollow noopener" referrerpolicy="unsafe-url" target="_blank"><strong>&gt; 优惠渠道价格预订</strong></a></td></tr></tbody></table><p><strong>✨ 第二天：2025年10月2日 · 摩登上海——云端上的东方明珠</strong></p><ul><li><strong>上午：奢华抵达上海。</strong> 早餐后，乘坐飞机（或高铁）前往上海虹桥或浦东机场。抵达后，建议打车或专车直达上海浦东丽晶酒店，办理入住。</li><li><strong>下午-夜晚：陆家嘴的极致体验。</strong> 您的酒店套餐包含了东方明珠江景双卧套房、金茂大厦门票、1000元酒店消费额度及丽晶俱乐部礼遇。下午可登上金茂大厦俯瞰浦江两岸的壮丽景色，感受上海的现代与繁华。傍晚，在酒店内享受丽晶俱乐部专属礼遇，品尝特调鸡尾酒，远眺外滩夜景，晚餐可选择酒店内米其林餐厅或周边高端食府。</li><li><strong>彩蛋：</strong> 上海浦东丽晶酒店的“东方明珠江景双卧套房”，不仅仅是房间，更是一幅流动的城市画卷。在房间内即可将陆家嘴的璀璨夜景尽收眼底，无需出门，便能独享这份震撼，是真正把钱花在“视野”和“回忆”上的极致体验。</li></ul><table><thead><tr><th style="text-align:left"></th><th style="text-align:left"></th></tr></thead><tbody><tr><td style="text-align:left"><img src="https://s.gqmg.com/https://images4.c-ctrip.com/target/0220d12000a5qbavc3AEF_C_500_500.jpg" alt="上海浦东丽晶酒店" style="width:160px;"></td><td style="text-align:left"><strong>上海浦东丽晶酒店</strong> （5星 #18985） <br> <strong>套餐:</strong> 东方明珠江景双卧套房 1晚+早餐 2 份/天+金茂大厦2大1小门票(儿童身高≤1.3米) 1 份+1000元酒店消费额度 1 份+2大1小（5岁以下）丽晶俱乐部礼遇 1 份+每次入住赠送首轮迷你吧（包含一瓶红酒） 1 份+Camelia特调鸡尾酒10选1及小食 1 份 <br> <strong>评分:</strong> 4.6 <br> <font style="color:red;font-weight:bolder;">¥10888</font> <del>¥23385</del> (4.7折) <br> <a href="https://m.ctrip.com/webapp/cw/hotel/hotelPackage/packageDetail.html?hotelId=347132&amp%3BpageName=packageDetail&amp%3Bproduct-id=76446975&amp%3Bproduct-type=presale-product&amp%3BhotelDataType=1&amp%3Bpopup=close&amp%3BcityId=2&amp%3BcheckInDate=&amp%3BcheckOutDate=&amp%3Bmktcart=true&amp%3BcartSource=kaiping&amp%3BcartChannel=36&amp%3Ballianceid=5347273&amp%3Bsid=203078555&f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" rel="external nofollow noopener" referrerpolicy="unsafe-url" target="_blank"><strong>&gt; 优惠渠道价格预订</strong></a></td></tr></tbody></table><p><strong>✨ 第三天：2025年10月3日 · 温泉南京——疗愈身心之旅</strong></p><ul><li><strong>上午：高铁抵达南京。</strong> 早餐后，从上海虹桥站乘坐高铁前往南京南站（约1.5-2小时）。抵达后，前往汤山元博纪温泉酒店，办理入住。</li><li><strong>下午-夜晚：私汤温泉与水世界。</strong> 酒店套餐包含臻享私汤家庭套房、汤山欢乐水世界门票及尊享私汤温泉。您可以尽情在酒店内享受私人温泉的疗愈，或前往汤山欢乐水世界，体验水上乐趣。晚餐可在酒店内品尝精美菜肴。</li><li><strong>彩蛋：</strong> 南京汤山元博纪温泉酒店的“臻享私汤家庭套房”，将温泉直接引入您的房间，让您在私密空间内尽享汤浴之乐。夜幕降临，伴着窗外的夜色泡一池私汤，是洗去旅途疲惫、彻底放松身心的绝佳方式。</li></ul><table><thead><tr><th style="text-align:left"></th><th style="text-align:left"></th></tr></thead><tbody><tr><td style="text-align:left"><img src="https://s.gqmg.com/https://images4.c-ctrip.com/target/0201b120009i2vks298D2_C_500_500.jpg" alt="南京汤山元博纪温泉酒店" style="width:160px;"></td><td style="text-align:left"><strong>南京汤山元博纪温泉酒店</strong> （5星 #27235） <br> <strong>套餐:</strong> 臻享私汤家庭套房 1晚+早餐 1 份/天+欢迎水果 1 份+迷你吧畅享 1 份+汤山欢乐水世界双人门票 2 份+尊享私汤温泉 1 份+阳山碑材景点门票 2 份 <br> <strong>评分:</strong> 4.6 <br> <font style="color:red;font-weight:bolder;">¥2899</font> <del>¥5080</del> (5.7折) <br> <a href="https://m.ctrip.com/webapp/cw/hotel/hotelPackage/packageDetail.html?hotelId=92857838&amp%3BpageName=packageDetail&amp%3Bproduct-id=77733903&amp%3Bproduct-type=presale-product&amp%3BhotelDataType=1&amp%3Bpopup=close&amp%3BcityId=12&amp%3BcheckInDate=&amp%3BcheckOutDate=&amp%3Bmktcart=true&amp%3BcartSource=kaiping&amp%3BcartChannel=36&amp%3Ballianceid=5347273&amp%3Bsid=203078555&f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" rel="external nofollow noopener" referrerpolicy="unsafe-url" target="_blank"><strong>&gt; 优惠渠道价格预订</strong></a></td></tr></tbody></table><p><strong>✨ 第四天：2025年10月4日 · 秘境苏州——林间别墅的宁静与奢华</strong></p><ul><li><strong>上午：高铁抵达苏州。</strong> 早餐后，从南京南站乘坐高铁前往苏州站（约1小时）。抵达后，建议打车或专车前往苏州裸心泊度假村，办理入住。</li><li><strong>下午：独享林间别墅与水疗。</strong> 您的酒店套餐包含了林间独栋别墅、早餐及单人一小时SPA套餐。在抵达后，您可以完全放松身心，在别墅的私密空间中享受宁静，或体验度假村内提供的SPA服务，让身心得到彻底的放松。</li><li><strong>傍晚：度假村内的精彩活动与告别。</strong> 度假村每天都会有丰富的活动（根据季节和天气更新），您可以参与其中，也可以选择在别墅内享受宁静。晚餐可选择度假村内的精致餐厅，享受私密而高品质的用餐体验。</li><li><strong>彩蛋：</strong> 苏州裸心泊度假村的“林间独栋别墅”，让您仿佛置身世外桃源。它的“隐藏魅力”在于，它完美融合了苏州的园林意境与度假村的现代舒适，在繁忙的旅途之后，为您提供一个真正的“回归自然，放空自我”的奢华秘境，是对传统苏州之美的一次创新诠释。</li></ul><table><thead><tr><th style="text-align:left"></th><th style="text-align:left"></th></tr></thead><tbody><tr><td style="text-align:left"><img src="https://s.gqmg.com/https://images4.c-ctrip.com/target/0203n120008hj7zdpAEFB_C_500_500.jpg" alt="苏州裸心泊度假村" style="width:160px;"></td><td style="text-align:left"><strong>苏州裸心泊度假村</strong> （5星 #17847） <br> <strong>套餐:</strong> 林间独栋别墅2房 1晚+早餐 4 份/天+每天精彩活动畅玩（根据季节和天气更新活动时间表） 1 份+单人一小时SPA套餐 1 份 <br> <strong>评分:</strong> 4.7 <br> <font style="color:red;font-weight:bolder;">¥5488</font> <del>¥6488</del> (8.5折) <br> <a href="https://m.ctrip.com/webapp/cw/hotel/hotelPackage/packageDetail.html?hotelId=72182167&amp%3BpageName=packageDetail&amp%3Bproduct-id=77981351&amp%3Bproduct-type=presale-product&amp%3BhotelDataType=1&amp%3Bpopup=close&amp%3BcityId=14&amp%3BcheckInDate=&amp%3BcheckOutDate=&amp%3Bmktcart=true&amp%3BcartSource=kaiping&amp%3BcartChannel=36&amp%3Ballianceid=5347273&amp%3Bsid=203078555&f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" rel="external nofollow noopener" referrerpolicy="unsafe-url" target="_blank"><strong>&gt; 优惠渠道价格预订</strong></a></td></tr></tbody></table><hr><p>这两套方案，无论是追求高性价比的深度文化之旅，还是偏爱极致奢华的身心放松，都将以苏州的诗意收尾，为您带来一段段值得分享、值得珍藏的旅程。</p><p>您的下一趟旅程看起来是这样的！快选择一个您心动的方案，点击链接，开启您的精彩之旅吧！</p><p>原文地址：<a href="https://hotel.gqmg.com/p/104/?f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE#blogs" rel="external nofollow noopener" referrerpolicy="unsafe-url" target="_blank">https://hotel.gqmg.com/p/104/#blogs</a></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;以下内容是用 &lt;a href=&quot;https://hotel.gqmg.com/mcp/?f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE&quot; rel=&quot;external nofollow noopener&quot; referrerpolicy=&quot;unsafe-url&quot; target=&quot;_blank&quot;&gt;特惠酒店MCP&lt;/a&gt; 生成的国庆行程计划。展示了MCP的行程规划能力；通过数据查询，智能推荐的能力；以及数据精确展示，局部修改能力。&lt;/p&gt;
&lt;p&gt;特惠酒店MCP会推荐两个路线，一个性价比优先，一个舒适优质路线。关于MCP的详情，随后单独介绍。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;输入需求：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;帮我规划国庆节旅游的酒店，路线是10.1从深圳出发自驾去厦门，途径泉州，10.5回，需要规划入住酒店和时间，和总预算，折扣，可以提供两个路线供选择。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;您渴望一场在苏州的休闲度假，追求那份独有的江南雅韵，这真是个绝佳的选择！作为您的创意旅伴，我观察到一个有趣的“悖论”——您的预算需求和旅行日期，似乎隐藏着一个更宏大的旅行版图。我们为您精心策划了不仅仅是一次苏州之旅，更是一场以苏州为终点，串联起江南精华的发现之旅，让您在有限的时间和预算里，收获超出预期的丰富体验。这正是我们为您“读懂”数据背后，所浮现的“隐藏的过人之处”。&lt;/p&gt;
    
    </summary>
    
      <category term="学习笔记" scheme="https://blogs.kainy.cn/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
      <category term="MCP" scheme="https://blogs.kainy.cn/tags/MCP/"/>
    
  </entry>
  
  <entry>
    <title>什么是设备指纹复制？怎么实现？</title>
    <link href="https://blogs.kainy.cn/2025/07/%E4%BB%80%E4%B9%88%E6%98%AF%E8%AE%BE%E5%A4%87%E6%8C%87%E7%BA%B9%E5%A4%8D%E5%88%B6%EF%BC%9F%E6%80%8E%E4%B9%88%E5%AE%9E%E7%8E%B0%EF%BC%9F/"/>
    <id>https://blogs.kainy.cn/2025/07/什么是设备指纹复制？怎么实现？/</id>
    <published>2025-07-09T09:27:15.000Z</published>
    <updated>2026-08-01T09:28:07.946Z</updated>
    
    <content type="html"><![CDATA[<h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>今天有客户询盘，问SyncMein扩展能否同步 fastmoss 的登录态，试了一下确实不行。</p><p>表现为：本地同浏览器跨profile（个人资料）ok，本地换浏览器偶尔不行，异地基本完全登不上。看来是结合了ck+浏览器指纹+IP校验登录态。</p><p>刚开始觉得不就是个查询 tiktok 数据的网站，至于这么严格么？直到看到官网定价…</p><a id="more"></a><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2025/07/mcvpkoil.png" alt="fastmoss价格表"></p><p>某宝上也有拆分来卖的，一天高达39元，销量还不错。天啦噜，跨境人的需求真的看不懂～</p><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2025/07/mcvq47kt.png" alt="fastmoss淘宝价格"></p><h2 id="原理"><a href="#原理" class="headerlink" title="原理"></a>原理</h2><p>一般的网站登录态保存在cookie中，那么只要将ck从一台电脑导出，在另外一台电脑导入。后者就能免密登上这个账号，这也是包括SyncMein在内的一般上号器工作原理。</p><p>那么设备指纹是什么呢？这是AI给的答案，好处是好理解。</p><blockquote><p>浏览器指纹，也称为设备指纹或浏览器指纹，是一种通过收集用户浏览器和设备配置信息来识别和追踪用户在线活动的技术。这种技术利用浏览器和操作系统等独特配置来创建独特的“指纹”，类似于现实生活中的指纹，用于区分和追踪用户，即使他们清除cookies或使用隐私模式</p></blockquote><p>所以对于fastmoss和Gmail这些同时校验ck和设备指纹的网站，相当于必须有两把匹配的钥匙，才能解开的锁。</p><p>经过两天尝试，写了一个demo浏览器扩展，来实现设备指纹的同步。</p><p>从设备指纹的产生过程，可以得知，要在不同设备复刻同一个指纹，除非魔改编译浏览器。几乎没有其他可能。</p><p>于是在想，既然山不过来，那就我自己过去：把需要免密登录的 设备的网络请求，以指令形式发给已登录设备的浏览器，由它转发给服务器，取到数据再返回。不就达到了“借用”指纹的效果？这就是“复制指纹”、“代理指纹”的由来。</p><h2 id="具体实现"><a href="#具体实现" class="headerlink" title="具体实现"></a>具体实现</h2><p>来看具体操作步骤，首先在宿主机，通过 SyncMein 扩展，鼠标移到需要分享口令的域名左边，点击“分享”按钮。</p><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2025/07/mcvquus3.png" alt="分享端操作-生成口令"></p><p>然后将口令分享给需要共享账号的B，B拿到口令后，安装<a href="https://blogs.kainy.cn/2025/07/SyncMein-client%E7%9A%84%E5%AE%89%E8%A3%85%E6%96%B9%E6%B3%95/#blogs">smi客户端扩展</a></p><p>然后按下图步骤导入口令，首次导入，需要安装证书，用于解密从宿主机代理过来的流量。</p><p>按照指引操作即可。</p><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2025/07/mcvr501y.png" alt="导入口令步骤"></p><p>由于工作原理是将被分享者的流量，代理到分享者（宿主机），需要宿主机在线，可以通过口令上的绿点查看宿主机在线情况。</p><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2025/07/mcvr6ogr.png" alt="宿主机在线状态查询"></p><p>导入口令后，再访问fastmoss，就会发现已经获得了登录态。</p><p>下图中，</p><ul><li>红点1是通过远程连接控制的windows系统，代表共享账号的接收端。</li><li>红点2是本地Mac系统，已经登录fastmoss，并生成口令，分享登录态，并提供代理服务。</li><li>红点3是本地浏览器控制台。</li></ul><p>可以看到windows系统已经免密登录Mac分享的同一个账号。而它的流量则出现在红点3中，Mac宿主机的网络面板。</p><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2025/07/mcvrjiyc.png" alt="达到异地不同浏览器间同步登录态的效果"></p><p>这样一来，被分享端端windows访问 fastmoss 网站的流量，都是通过宿主机的网络出口，不仅借用了宿主机的设备指纹，连IP也是一样的。在 fastmoss 服务器看来，接收到的流量并无区别，就相当于还是在宿主机Mac上操作。</p><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2025/07/mcvshbiu.png" alt="请求头详情"></p><p>我们给红点3的控制面板来个特写，可以看到请求头信息都是是宿主机（Mac系统）的，最明显是红框中的UserAgent。因为流量不是普通的代理转发，而是宿主机接收到指令后，发送请求，并将结果返回，相当于MITM。这就是为什么需要安装根证书解密流量的原因。</p><blockquote><blockquote><p>纯技术分析，无不良引导。使用请遵守相关法律法规和服务提供商的用户协议!</p></blockquote></blockquote>]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;背景&quot;&gt;&lt;a href=&quot;#背景&quot; class=&quot;headerlink&quot; title=&quot;背景&quot;&gt;&lt;/a&gt;背景&lt;/h2&gt;&lt;p&gt;今天有客户询盘，问SyncMein扩展能否同步 fastmoss 的登录态，试了一下确实不行。&lt;/p&gt;
&lt;p&gt;表现为：本地同浏览器跨profile（个人资料）ok，本地换浏览器偶尔不行，异地基本完全登不上。看来是结合了ck+浏览器指纹+IP校验登录态。&lt;/p&gt;
&lt;p&gt;刚开始觉得不就是个查询 tiktok 数据的网站，至于这么严格么？直到看到官网定价…&lt;/p&gt;
    
    </summary>
    
      <category term="学习笔记" scheme="https://blogs.kainy.cn/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
      <category term="扩展" scheme="https://blogs.kainy.cn/tags/%E6%89%A9%E5%B1%95/"/>
    
      <category term="SyncMein" scheme="https://blogs.kainy.cn/tags/SyncMein/"/>
    
  </entry>
  
  <entry>
    <title>服务器进程占用大量内存，如何定位启动它的程序</title>
    <link href="https://blogs.kainy.cn/2025/07/%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%BF%9B%E7%A8%8B%E5%8D%A0%E7%94%A8%E5%A4%A7%E9%87%8F%E5%86%85%E5%AD%98%EF%BC%8C%E5%A6%82%E4%BD%95%E5%AE%9A%E4%BD%8D%E5%90%AF%E5%8A%A8%E5%AE%83%E7%9A%84%E7%A8%8B%E5%BA%8F/"/>
    <id>https://blogs.kainy.cn/2025/07/服务器进程占用大量内存，如何定位启动它的程序/</id>
    <published>2025-07-04T09:27:15.000Z</published>
    <updated>2026-08-01T09:28:07.955Z</updated>
    
    <content type="html"><![CDATA[<p>根据 <code>top</code> 命令输出，有一个进程（PID 为 <strong>303679</strong>）占用了大量的物理内存（<strong>4.1g</strong>），需要定位它是什么程序。</p><p>这个输出行提供了几个关键信息：</p><ul><li><strong>PID (进程ID)</strong>: <code>303679</code></li><li><strong>USER (运行用户)</strong>: <code>www</code> (这通常是 Web 服务器，如 Nginx 或 Apache，或其下运行的 Web 应用程序所使用的用户)</li><li><strong>RES (物理内存)</strong>: <code>4.1g</code></li><li><strong>%MEM (内存百分比)</strong>: <code>54.2%</code></li><li><strong>COMMAND (命令名)</strong>: <code>pt_main_thread</code> (这可能是一个线程名或主程序的一部分，不一定是程序的全名)</li></ul><p>要精确定位这个进程到底是由哪个程序启动的，以及它的完整路径和启动参数，您可以在服务器的命令行终端中执行以下步骤。<br><a id="more"></a></p><h3 id="定位步骤"><a href="#定位步骤" class="headerlink" title="定位步骤"></a>定位步骤</h3><p>以下命令请使用您提供的 <strong>PID <code>303679</code></strong> 来执行。</p><h4 id="1-查看进程的完整命令和参数"><a href="#1-查看进程的完整命令和参数" class="headerlink" title="1. 查看进程的完整命令和参数"></a>1. 查看进程的完整命令和参数</h4><p>这是最直接有效的一步，可以告诉您这个进程是如何被启动的。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ps -fp 303679</span><br></pre></td></tr></table></figure><p><strong>命令解释</strong>:</p><ul><li><code>ps -f</code>: 显示进程的完整格式信息 (full format)。</li><li><code>ps -p 303679</code>: 指定要查询的进程 ID。</li></ul><p><strong>输出示例</strong>:<br>您可能会看到类似下面这样的输出：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">UID</span>          <span class="string">PID</span>    <span class="string">PPID</span>  <span class="string">C</span> <span class="string">STIME</span> <span class="string">TTY</span>          <span class="string">TIME</span> <span class="string">CMD</span></span><br><span class="line"><span class="string">www</span>       <span class="number">303679</span>  <span class="number">12345</span>  <span class="number">0</span> <span class="string">Jul03</span> <span class="string">?</span>        <span class="number">00</span><span class="string">:00:51</span> <span class="string">/usr/bin/python3</span> <span class="string">/var/www/my_app/main.py</span> <span class="string">--worker-threads=10</span></span><br></pre></td></tr></table></figure><p>在这个示例中，<code>CMD</code> 这一列会显示<strong>完整的启动命令</strong>。从这里您就可以清晰地看到是 <code>/usr/bin/python3</code> 运行了 <code>/var/www/my_app/main.py</code> 这个脚本。</p><h4 id="2-定位可执行文件的绝对路径"><a href="#2-定位可执行文件的绝对路径" class="headerlink" title="2. 定位可执行文件的绝对路径"></a>2. 定位可执行文件的绝对路径</h4><p>如果上一步的 <code>CMD</code> 信息不够明确，或者您想直接找到可执行文件在磁盘上的位置，可以使用以下命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ls -l /proc/303679/exe</span><br></pre></td></tr></table></figure><p><strong>命令解释</strong>:</p><ul><li>在 Linux 系统中，<code>/proc/[PID]/exe</code> 是一个特殊的文件，它是一个符号链接，直接指向该进程对应的可执行文件的实际位置。</li><li><code>ls -l</code> 会显示这个链接所指向的真实路径。</li></ul><p><strong>输出示例</strong>:</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">lrwxrwxrwx</span> <span class="number">1</span> <span class="string">www</span> <span class="string">www</span> <span class="number">0</span> <span class="string">Jul</span> <span class="number">4</span> <span class="number">08</span><span class="string">:50</span> <span class="string">/proc/303679/exe</span> <span class="string">-&gt;</span> <span class="string">/usr/local/bin/some_application</span></span><br></pre></td></tr></table></figure><p>这个输出明确地告诉您，该进程的可执行文件是 <code>/usr/local/bin/some_application</code>。</p><h4 id="3-查看进程树关系"><a href="#3-查看进程树关系" class="headerlink" title="3. 查看进程树关系"></a>3. 查看进程树关系</h4><p>了解一个进程是如何被启动的（它的父进程是谁）也很有帮助。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pstree -p 303679</span><br></pre></td></tr></table></figure><p><strong>命令解释</strong>:</p><ul><li><code>pstree</code> 会以树状结构显示进程关系。</li><li><code>-p</code> 会同时显示进程的 PID。</li></ul><p><strong>输出示例</strong>:<br>您可能会看到这样的结构，帮助您理解其调用关系：</p><figure class="highlight erlang"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="title">systemd</span><span class="params">(<span class="number">1</span>)</span>---<span class="title">apache2</span><span class="params">(<span class="number">12300</span>)</span>---<span class="title">apache2</span><span class="params">(<span class="number">12345</span>)</span>---<span class="title">pt_main_thread</span><span class="params">(<span class="number">303679</span>)</span></span></span><br></pre></td></tr></table></figure><p>这表明该进程是由 Apache Web 服务器启动的。</p><h4 id="4-查看进程打开的文件和网络连接"><a href="#4-查看进程打开的文件和网络连接" class="headerlink" title="4. 查看进程打开的文件和网络连接"></a>4. 查看进程打开的文件和网络连接</h4><p>这个命令可以提供非常详细的上下文信息，比如程序正在读写哪些文件，或监听哪个端口。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">lsof -p 303679 | less</span><br></pre></td></tr></table></figure><p><strong>命令解释</strong>:</p><ul><li><code>lsof</code> (List Open Files) 用于列出进程打开的所有文件和网络连接。</li><li>由于输出可能很长，通过 <code>| less</code> 可以方便地分页查看。</li></ul><h3 id="总结与分析"><a href="#总结与分析" class="headerlink" title="总结与分析"></a>总结与分析</h3><p>根据您提供的信息（<code>www</code> 用户和高内存占用），这个进程<strong>极有可能</strong>是：</p><ul><li><strong>Web 应用程序</strong>: 一个运行在 Web 服务器（如 Nginx, Apache）下的应用程序，可能是用 PHP, Python, Java, Node.js 等语言编写的。高内存占用可能是由于程序代码存在内存泄漏、缓存设置过大或正在处理非常大的数据。</li><li><strong>Web 服务器的某个工作进程</strong>: 例如 Apache 或 PHP-FPM 的某个子进程出现异常。</li></ul><p><strong>建议操作顺序</strong>：</p><ol><li>首先执行 <code>ps -fp 303679</code> 查看完整的启动命令，这是最关键的一步。</li><li>然后执行 <code>ls -l /proc/303679/exe</code> 确认可执行文件的具体位置。</li><li>结合这两步的结果，您就能准确地定位到是哪个具体的程序或脚本导致了内存占用过高，从而可以进一步分析代码或调整配置。</li></ol>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;根据 &lt;code&gt;top&lt;/code&gt; 命令输出，有一个进程（PID 为 &lt;strong&gt;303679&lt;/strong&gt;）占用了大量的物理内存（&lt;strong&gt;4.1g&lt;/strong&gt;），需要定位它是什么程序。&lt;/p&gt;
&lt;p&gt;这个输出行提供了几个关键信息：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PID (进程ID)&lt;/strong&gt;: &lt;code&gt;303679&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;USER (运行用户)&lt;/strong&gt;: &lt;code&gt;www&lt;/code&gt; (这通常是 Web 服务器，如 Nginx 或 Apache，或其下运行的 Web 应用程序所使用的用户)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RES (物理内存)&lt;/strong&gt;: &lt;code&gt;4.1g&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;%MEM (内存百分比)&lt;/strong&gt;: &lt;code&gt;54.2%&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;COMMAND (命令名)&lt;/strong&gt;: &lt;code&gt;pt_main_thread&lt;/code&gt; (这可能是一个线程名或主程序的一部分，不一定是程序的全名)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;要精确定位这个进程到底是由哪个程序启动的，以及它的完整路径和启动参数，您可以在服务器的命令行终端中执行以下步骤。&lt;br&gt;
    
    </summary>
    
      <category term="学习笔记" scheme="https://blogs.kainy.cn/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
      <category term="方法" scheme="https://blogs.kainy.cn/tags/%E6%96%B9%E6%B3%95/"/>
    
      <category term="服务器" scheme="https://blogs.kainy.cn/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
      <category term="运维" scheme="https://blogs.kainy.cn/tags/%E8%BF%90%E7%BB%B4/"/>
    
  </entry>
  
  <entry>
    <title>SyncMein-client扩展安装和使用方法</title>
    <link href="https://blogs.kainy.cn/2025/07/SyncMein-client%E7%9A%84%E5%AE%89%E8%A3%85%E6%96%B9%E6%B3%95/"/>
    <id>https://blogs.kainy.cn/2025/07/SyncMein-client的安装方法/</id>
    <published>2025-07-01T09:27:15.000Z</published>
    <updated>2026-08-01T09:28:07.941Z</updated>
    
    <content type="html"><![CDATA[<p>1、首先访问 <a href="https://t.kainy.cn/smi-c/?f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE" rel="external nofollow noopener" referrerpolicy="unsafe-url" target="_blank">https://t.kainy.cn/smi-c/</a> 下载zip包，解压出 smi-client 目录。</p><p>2、在浏览器地址栏输入 chrome://extensions/ ，按回车键访问插件页面，钩上右上角的“开发者模式”。</p><a id="more"></a><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2025/07/mclnt1r3.png" alt="插件页"></p><p>3、将第1步解压好的 smi-client 文件夹，拖动到第2步打开的插件页面上，完成安装。</p><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2025/07/mclpz3xg.png" alt="image"><br>4、安装后，应该可以看到上图红圈的部分。为了方便后续使用，我们点下图红点1，右上角的拼图按钮。然后点红点2点图钉按钮。将上号器固定。</p><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2025/07/mclq37tn.png" alt="image"></p><p>5、按照红点顺序，点开刚才固定好的插件图标，然后贴如口令，点击“导入口令”。</p><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2025/07/mcls4b01.png" alt="image"></p><p>导入口令后，刷新页面应该就是已登录状态了。</p><p>后续如果登录态掉了，首先点口令右边的刷新按钮（下图红点1）可以拉取最新ck到本地。</p><p>如果还是不能登上，再点通知口令作者（下图红点2）， 可能是ck过期，会发送通知口令作者重新登录共享账号，并更新ck。作者更新ck后，你再点刷新，就可以登上了。</p><p><img src="https://s.gqmg.com/https://oray.kainy.cn:38400/_upload/./content/temp/2025/07/mclttnkh.png" alt="image"></p><p>需要注意的是：作者更新ck前，只能发送一次提醒哦。以免太多通知打扰作者，也请大家确认登录态失效才提醒，否则可能误报次数多了，可能影响作者更新ck多失效哟～</p><blockquote><p>请遵守账号所属网站用户协议及相关法律法规，合理使用本工具。使用即代表同意，自行承担使用后果和可能的风险。</p></blockquote>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;1、首先访问 &lt;a href=&quot;https://t.kainy.cn/smi-c/?f=%E6%9D%A5%E8%87%AAblogs.kainy.cn%E7%9A%84%E8%AE%BF%E9%97%AE&quot; rel=&quot;external nofollow noopener&quot; referrerpolicy=&quot;unsafe-url&quot; target=&quot;_blank&quot;&gt;https://t.kainy.cn/smi-c/&lt;/a&gt; 下载zip包，解压出 smi-client 目录。&lt;/p&gt;
&lt;p&gt;2、在浏览器地址栏输入 chrome://extensions/ ，按回车键访问插件页面，钩上右上角的“开发者模式”。&lt;/p&gt;
    
    </summary>
    
      <category term="学习笔记" scheme="https://blogs.kainy.cn/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
      <category term="扩展" scheme="https://blogs.kainy.cn/tags/%E6%89%A9%E5%B1%95/"/>
    
      <category term="SyncMein" scheme="https://blogs.kainy.cn/tags/SyncMein/"/>
    
  </entry>
  
  <entry>
    <title>解决服务器磁盘空间不足问题的两个办法</title>
    <link href="https://blogs.kainy.cn/2025/06/%E8%A7%A3%E5%86%B3%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%A3%81%E7%9B%98%E7%A9%BA%E9%97%B4%E4%B8%8D%E8%B6%B3%E9%97%AE%E9%A2%98%E7%9A%84%E4%B8%A4%E4%B8%AA%E5%8A%9E%E6%B3%95/"/>
    <id>https://blogs.kainy.cn/2025/06/解决服务器磁盘空间不足问题的两个办法/</id>
    <published>2025-06-23T09:27:15.000Z</published>
    <updated>2026-08-01T09:28:07.964Z</updated>
    
    <content type="html"><![CDATA[<h2 id="nginx-如何限定log文件的尺寸"><a href="#nginx-如何限定log文件的尺寸" class="headerlink" title="nginx 如何限定log文件的尺寸"></a>nginx 如何限定log文件的尺寸</h2><p>要限定 Nginx 日志文件的尺寸，正确且最常用的方法并非在 Nginx 的配置文件中直接设置，因为 <strong>Nginx 本身没有提供按文件大小自动切割日志的功能</strong>。</p><p>正确的做法是使用一个名为 <code>logrotate</code> 的标准 Linux 工具。<code>logrotate</code> 是一个强大的日志管理工具，它可以根据文件大小、时间（每天、每周、每月）等策略来自动轮转、压缩和删除日志文件。</p><a id="more"></a><p>几乎所有的 Linux 发行版（包括 CentOS, Ubuntu, Debian 等）都预装了 <code>logrotate</code>。通过配置 <code>logrotate</code>，您可以实现：</p><ol><li>当日志文件达到指定大小时，将其重命名。</li><li>创建一个新的空日志文件供 Nginx 继续写入。</li><li>压缩旧的日志文件以节省磁盘空间。</li><li>定期删除过旧的日志文件。</li></ol><p>下面是具体的操作步骤和配置示例。</p><hr><h3 id="使用-logrotate-限定-Nginx-日志大小"><a href="#使用-logrotate-限定-Nginx-日志大小" class="headerlink" title="使用 logrotate 限定 Nginx 日志大小"></a>使用 <code>logrotate</code> 限定 Nginx 日志大小</h3><h4 id="第-1-步：创建-logrotate-配置文件"><a href="#第-1-步：创建-logrotate-配置文件" class="headerlink" title="第 1 步：创建 logrotate 配置文件"></a>第 1 步：创建 <code>logrotate</code> 配置文件</h4><p>为 Nginx 创建一个专门的 <code>logrotate</code> 配置文件。这个文件通常放在 <code>/etc/logrotate.d/</code> 目录下。如果您的系统中已经有了一个名为 <code>nginx</code> 的文件，可以直接修改它；如果没有，就创建一个新文件。</p><p>使用文本编辑器（如 <code>vim</code> 或 <code>nano</code>）创建文件：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo vim /etc/logrotate.d/nginx</span><br></pre></td></tr></table></figure><h4 id="第-2-步：编写配置文件内容"><a href="#第-2-步：编写配置文件内容" class="headerlink" title="第 2 步：编写配置文件内容"></a>第 2 步：编写配置文件内容</h4><p>向该文件中添加以下内容。这是一个非常实用且通用的配置模板，您可以根据自己的需求进行调整。</p><figure class="highlight dts"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta-keyword">/var/</span>log<span class="meta-keyword">/nginx/</span>*.<span class="class">log </span>&#123;</span><br><span class="line">    <span class="meta"># 当日志文件达到 100M 时进行轮转</span></span><br><span class="line">    size <span class="number">100</span>M</span><br><span class="line"></span><br><span class="line">    <span class="meta"># 每天检查一次，如果满足条件（如大小）就执行轮转</span></span><br><span class="line">    daily</span><br><span class="line"></span><br><span class="line">    <span class="meta"># 保留 14 个轮转后的日志文件副本</span></span><br><span class="line">    rotate <span class="number">14</span></span><br><span class="line"></span><br><span class="line">    <span class="meta"># 对轮转后的旧日志文件进行 gzip 压缩</span></span><br><span class="line">    compress</span><br><span class="line"></span><br><span class="line">    <span class="meta"># 和 compress 指令配合使用，最近一次轮转的日志不压缩，以方便查看</span></span><br><span class="line">    delaycompress</span><br><span class="line"></span><br><span class="line">    <span class="meta"># 如果日志文件不存在，不要报错</span></span><br><span class="line">    missingok</span><br><span class="line"></span><br><span class="line">    <span class="meta"># 不轮转空文件</span></span><br><span class="line">    notifempty</span><br><span class="line"></span><br><span class="line">    <span class="meta"># 使用 root 用户和 adm 组（或 www-data/nginx 组）创建新日志文件</span></span><br><span class="line">    <span class="meta"># 权限为 640</span></span><br><span class="line">    create <span class="number">0640</span> nginx adm</span><br><span class="line"></span><br><span class="line">    <span class="meta"># 在轮转所有匹配的日志文件后，执行 postrotate 脚本</span></span><br><span class="line">    sharedscripts</span><br><span class="line"></span><br><span class="line">    <span class="meta"># postrotate 和 endscript 之间的命令会在日志文件轮转后执行</span></span><br><span class="line">    postrotate</span><br><span class="line">        <span class="meta"># 向 Nginx 主进程发送 USR1 信号，使其重新打开日志文件</span></span><br><span class="line">        <span class="meta"># 这可以确保日志无缝地写入新创建的文件中，而无需重启 Nginx 服务</span></span><br><span class="line">        if [ -f <span class="meta-keyword">/var/</span>run/nginx.pid ]; then</span><br><span class="line">            kill -USR1 `cat <span class="meta-keyword">/var/</span>run/nginx.pid`</span><br><span class="line">        fi</span><br><span class="line">    endscript</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h3 id="配置参数详解"><a href="#配置参数详解" class="headerlink" title="配置参数详解"></a>配置参数详解</h3><ul><li><code>/var/log/nginx/*.log</code>: 指定要管理的日志文件路径。<code>*</code> 是通配符，表示匹配 <code>/var/log/nginx/</code> 目录下的所有以 <code>.log</code> 结尾的文件（例如 <code>access.log</code> 和 <code>error.log</code>）。</li><li><code>size 100M</code>: <strong>这是限定文件大小的关键指令</strong>。当日志文件大小超过 100MB 时，<code>logrotate</code> 就会触发轮转操作。您可以将 <code>100M</code> 修改为任何您需要的大小，如 <code>500M</code>, <code>1G</code>。</li><li><code>daily</code>: 指定轮转周期为每天。即使文件大小未达到 <code>size</code> 设定的值，<code>logrotate</code> 每天也会检查一次。其他可用值为 <code>weekly</code>, <code>monthly</code>, <code>yearly</code>。通常 <code>size</code> 和 <code>daily</code> 会结合使用。</li><li><code>rotate 14</code>: 指定保留多少个归档日志。在这个例子中，会保留14个备份。当生成第15个备份时，最旧的那个（例如 <code>access.log.15.gz</code>）将被删除。</li><li><code>compress</code>: 通过 <code>gzip</code> 压缩轮转后的日志文件，节省空间。压缩后的文件通常会带有 <code>.gz</code> 后缀。</li><li><code>delaycompress</code>: 延迟压缩，与 <code>compress</code> 选项共用。这可以确保当天的日志文件（例如 <code>access.log.1</code>）不会被立即压缩，方便排查问题。下次轮转时，它才会被压缩成 <code>.gz</code> 文件。</li><li><code>missingok</code>: 如果找不到日志文件，不要当作错误处理。</li><li><code>notifempty</code>: 如果日志文件是空的，则不执行轮转。</li><li><code>create 0640 nginx adm</code>: 创建新日志文件时所使用的权限和所有者/组。请确保这里的用户和组与 Nginx 运行用户匹配。在 Debian/Ubuntu 上可能是 <code>www-data</code>，在 CentOS 上可能是 <code>nginx</code>。您可以通过 <code>ps aux | grep nginx</code> 查看 Nginx 的运行用户。</li><li><code>sharedscripts</code> / <code>postrotate</code>: 这部分非常重要。<code>postrotate</code> 块中的脚本会在所有匹配的日志都轮转完毕后执行一次。<code>kill -USR1 $(cat /var/run/nginx.pid)</code> 命令会通知 Nginx 主进程重新打开日志文件句柄。这样，新的日志就会被写入到 <code>logrotate</code> 新创建的空日志文件中，从而实现无缝切换，<strong>避免了重启 Nginx 服务导致的中断</strong>。</li></ul><hr><h3 id="第-3-步：测试和强制执行"><a href="#第-3-步：测试和强制执行" class="headerlink" title="第 3 步：测试和强制执行"></a>第 3 步：测试和强制执行</h3><p><code>logrotate</code> 通常由 <code>cron</code> 每日自动执行，您不需要手动干预。但如果您想立即测试配置是否正确，可以使用以下命令：</p><ol><li><p><strong>调试模式（模拟执行）</strong>：<br>这个命令会模拟执行轮转过程并显示详细输出，但不会真正修改任何文件。这是检查配置语法是否正确的最佳方式。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo logrotate -d /etc/logrotate.d/nginx</span><br></pre></td></tr></table></figure></li><li><p><strong>强制执行模式</strong>：<br>这个命令会强制立即执行轮转，即使时间和大小条件不满足。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo logrotate -f /etc/logrotate.d/nginx</span><br></pre></td></tr></table></figure><p>执行后，您可以去 <code>/var/log/nginx</code> 目录下查看是否生成了如 <code>access.log.1</code> 这样的文件。</p></li></ol><h3 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h3><p>通过配置 <code>logrotate</code>，您可以非常灵活且可靠地管理 Nginx 的日志文件大小，防止单个日志文件无限增长耗尽磁盘空间，这是生产环境中管理 Nginx 日志的标准实践。</p><p>好的，这是一个在 CentOS 7.4 系统上运行的磁盘空间清理脚本。该脚本将帮助您查找并列出占用磁盘空间较大的文件和目录，并提供一些常见的可安全清理的目录路径建议，供您手动验证和清理。</p><p><strong>重要提示：</strong></p><ul><li><strong>在运行任何删除命令之前，请务ah必仔细检查列出的文件和目录，确保它们不是重要的系统文件或用户数据。</strong></li><li><strong>对于不确定的文件，建议先备份再删除。</strong></li><li><strong>建议以 root 用户身份或具有 sudo 权限的用户运行此脚本，以便全面扫描系统。</strong></li><li>此脚本主要用于查找和列出文件/目录，并不会自动执行任何删除操作，以确保安全。您可以根据脚本的输出，手动执行清理命令。</li></ul><hr><h2 id="磁盘空间清理脚本-clean-disk-sh"><a href="#磁盘空间清理脚本-clean-disk-sh" class="headerlink" title="磁盘空间清理脚本 (clean_disk.sh)"></a>磁盘空间清理脚本 (clean_disk.sh)</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># ==============================================================================</span></span><br><span class="line"><span class="comment"># CentOS 7.4 磁盘空间清理辅助脚本</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># 功能:</span></span><br><span class="line"><span class="comment">#   1. 查找系统中占用空间最大的文件。</span></span><br><span class="line"><span class="comment">#   2. 查找系统中占用空间最大的目录。</span></span><br><span class="line"><span class="comment">#   3. 列出常见的可以清理的大目录路径，供手动验证。</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># 使用方法:</span></span><br><span class="line"><span class="comment">#   1. 保存脚本为 clean_disk.sh</span></span><br><span class="line"><span class="comment">#   2. 赋予执行权限: chmod +x clean_disk.sh</span></span><br><span class="line"><span class="comment">#   3. 运行脚本: ./clean_disk.sh</span></span><br><span class="line"><span class="comment"># ==============================================================================</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"============================================================"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"          CentOS 7.4 磁盘空间清理辅助脚本"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"============================================================"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">""</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"脚本将开始分析磁盘空间占用情况，这可能需要一些时间..."</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">""</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># --- 1. 查找并列出系统中最大的前 20 个文件 ---</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"--- 正在查找系统中最大的前 20 个文件 (大于 500MB) ---"</span></span><br><span class="line">find / -<span class="built_in">type</span> f -size +500M -<span class="built_in">exec</span> du -h &#123;&#125; + 2&gt;/dev/null | sort -rh | head -n 20</span><br><span class="line"><span class="built_in">echo</span> <span class="string">""</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"提示：请检查以上列出的文件。常见的大文件可能包括日志文件、备份文件、数据库文件或虚拟机镜像。"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"对于日志文件，可以直接删除或清空。对于其他文件，请确认不再需要后手动删除。"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"例如，清空一个日志文件：&gt; /path/to/large/logfile.log"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"删除一个文件：rm /path/to/large/file"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">""</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"------------------------------------------------------------"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">""</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># --- 2. 查找并列出系统中最大的前 20 个目录 ---</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"--- 正在查找系统中最大的前 20 个目录 ---"</span></span><br><span class="line">du -h / 2&gt;/dev/null | sort -rh | head -n 20</span><br><span class="line"><span class="built_in">echo</span> <span class="string">""</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"提示：请检查以上列出的目录。常见的占用空间大的目录可能在 /var, /usr, /home, /opt 等路径下。"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"您可以使用 'du -h --max-depth=1 /path/to/large/directory' 命令逐层深入查找具体是哪个子目录占用了空间。"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">""</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"------------------------------------------------------------"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">""</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># --- 3. 疑似可以清理的大目录和文件类型 ---</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"--- 疑似可以清理的大目录路径和建议 ---"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">""</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 检查 /var/log/journal</span></span><br><span class="line">journal_size=$(du -sh /var/<span class="built_in">log</span>/journal/ 2&gt;/dev/null | awk <span class="string">'&#123;print $1&#125;'</span>)</span><br><span class="line"><span class="keyword">if</span> [ -n <span class="string">"<span class="variable">$journal_size</span>"</span> ]; <span class="keyword">then</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">"1. Systemd Journal 日志 (/var/log/journal/):"</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">"   - 当前占用空间: <span class="variable">$journal_size</span>"</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">"   - 这些是 systemd 的日志文件。您可以清理旧的日志。"</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">"   - 清理建议:"</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">"     # 保留最近 2 天的日志: journalctl --vacuum-time=2d"</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">"     # 限制日志文件最大为 500MB: journalctl --vacuum-size=500M"</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">""</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 检查 /var/cache/yum</span></span><br><span class="line">yum_cache_size=$(du -sh /var/cache/yum/ 2&gt;/dev/null | awk <span class="string">'&#123;print $1&#125;'</span>)</span><br><span class="line"><span class="keyword">if</span> [ -n <span class="string">"<span class="variable">$yum_cache_size</span>"</span> ]; <span class="keyword">then</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">"2. YUM 软件包缓存 (/var/cache/yum/):"</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">"   - 当前占用空间: <span class="variable">$yum_cache_size</span>"</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">"   - 这是 YUM 包管理器下载的软件包和元数据的缓存。"</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">"   - 清理建议 (通常可以安全执行):"</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">"     # 清理所有缓存: yum clean all"</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">""</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 检查 /tmp 和 /var/tmp</span></span><br><span class="line">tmp_size=$(du -sh /tmp/ 2&gt;/dev/null | awk <span class="string">'&#123;print $1&#125;'</span>)</span><br><span class="line">var_tmp_size=$(du -sh /var/tmp/ 2&gt;/dev/null | awk <span class="string">'&#123;print $1&#125;'</span>)</span><br><span class="line"><span class="keyword">if</span> [ -n <span class="string">"<span class="variable">$tmp_size</span>"</span> ] || [ -n <span class="string">"<span class="variable">$var_tmp_size</span>"</span> ]; <span class="keyword">then</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">"3. 临时文件目录 (/tmp/ 和 /var/tmp/):"</span></span><br><span class="line">    <span class="keyword">if</span> [ -n <span class="string">"<span class="variable">$tmp_size</span>"</span> ]; <span class="keyword">then</span></span><br><span class="line">        <span class="built_in">echo</span> <span class="string">"   - /tmp/ 当前占用空间: <span class="variable">$tmp_size</span>"</span></span><br><span class="line">    <span class="keyword">fi</span></span><br><span class="line">    <span class="keyword">if</span> [ -n <span class="string">"<span class="variable">$var_tmp_size</span>"</span> ]; <span class="keyword">then</span></span><br><span class="line">        <span class="built_in">echo</span> <span class="string">"   - /var/tmp/ 当前占用空间: <span class="variable">$var_tmp_size</span>"</span></span><br><span class="line">    <span class="keyword">fi</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">"   - 这些目录存放临时文件，通常可以删除旧的文件。"</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">"   - 清理建议:"</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">"     # 删除超过 7 天未访问的临时文件 (请谨慎操作):"</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">"     # find /tmp -type f -atime +7 -delete"</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">"     # find /var/tmp -type f -atime +7 -delete"</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">""</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 检查旧的内核</span></span><br><span class="line">old_kernels=$(rpm -q kernel | sed <span class="string">'$d'</span> | wc -l)</span><br><span class="line"><span class="keyword">if</span> [ <span class="string">"<span class="variable">$old_kernels</span>"</span> -gt 1 ]; <span class="keyword">then</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">"4. 旧的内核版本:"</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">"   - 系统中存在多个内核版本。保留一到两个新的即可。"</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">"   - 当前已安装的内核："</span></span><br><span class="line">    rpm -q kernel</span><br><span class="line">    <span class="built_in">echo</span> <span class="string">"   - 清理建议:"</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">"     # 安装 yum-utils: yum install yum-utils -y"</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">"     # 清理旧内核 (将只保留最新的 2 个): package-cleanup --oldkernels --count=2"</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">""</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 检查日志文件目录 /var/log</span></span><br><span class="line">log_dir_size=$(du -sh /var/<span class="built_in">log</span>/ 2&gt;/dev/null | awk <span class="string">'&#123;print $1&#125;'</span>)</span><br><span class="line"><span class="keyword">if</span> [ -n <span class="string">"<span class="variable">$log_dir_size</span>"</span> ]; <span class="keyword">then</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">"5. 日志文件目录 (/var/log/):"</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">"   - 当前占用空间: <span class="variable">$log_dir_size</span>"</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">"   - 这个目录包含各种系统和应用的日志文件。定期归档和清理是好习惯。"</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">"   - 查找大的日志文件 (例如大于 100MB):"</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">"     # find /var/log -type f -size +100M -ls"</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">"   - 对于不再需要的旧日志文件 (.log.1, .log.gz 等)，可以直接删除。"</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">""</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"============================================================"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"                   脚本执行完毕"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"============================================================"</span></span><br></pre></td></tr></table></figure><hr><h3 id="如何使用脚本"><a href="#如何使用脚本" class="headerlink" title="如何使用脚本"></a>如何使用脚本</h3><ol><li><p><strong>保存脚本</strong><br>将上面的代码内容复制并粘贴到一个新文件中，例如 <code>clean_disk.sh</code>。</p></li><li><p><strong>赋予执行权限</strong><br>在终端中，进入到脚本所在的目录，然后运行以下命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">chmod +x clean_disk.sh</span><br></pre></td></tr></table></figure></li><li><p><strong>运行脚本</strong><br>使用 <code>sudo</code> 或者以 <code>root</code> 用户身份运行脚本：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo ./clean_disk.sh</span><br></pre></td></tr></table></figure><p>或者切换到 root 用户后再执行：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">su -</span><br><span class="line">./path/to/clean_disk.sh</span><br></pre></td></tr></table></figure></li></ol><h3 id="脚本输出解读和后续步骤"><a href="#脚本输出解读和后续步骤" class="headerlink" title="脚本输出解读和后续步骤"></a>脚本输出解读和后续步骤</h3><p>脚本运行后，会依次输出三个部分的内容：</p><ol><li><p><strong>系统中最大的前 20 个文件</strong>：</p><ul><li><strong>关注点</strong>：重点关注后缀为 <code>.log</code>, <code>.tar.gz</code>, <code>.zip</code>, <code>.bak</code> 的文件，以及一些看起来异常大的文件。</li><li><strong>处理方法</strong>：<ul><li>对于日志文件，如果您确认日志内容无用，可以直接使用 <code>&gt;</code> 符号清空，例如：<code>&gt; /var/log/some-large-log.log</code>。这比删除文件再创建更好，可以避免因文件句柄被进程占用导致的空间不释放问题。</li><li>对于备份文件或压缩包，确认不再需要后，使用 <code>rm</code> 命令删除。</li></ul></li></ul></li><li><p><strong>系统中最大的前 20 个目录</strong>：</p><ul><li><strong>关注点</strong>：这可以帮助您快速定位到哪个主目录下包含了大量数据。通常 <code>/var</code>（日志、缓存、数据库）、<code>/home</code>（用户数据）、<code>/usr</code>（软件安装）、<code>/opt</code>（第三方软件）是需要关注的重点。</li><li><p><strong>处理方法</strong>：当您发现一个大目录，例如 <code>/var/www/html</code>，您可以使用以下命令进一步分析其子目录的大小：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo du -h --max-depth=1 /var/www/html</span><br></pre></td></tr></table></figure><p>这样逐层深入，直到找到最终占用空间的文件或目录。</p></li></ul></li><li><p><strong>疑似可以清理的大目录路径和建议</strong>：</p><ul><li><strong>Systemd Journal 日志</strong>：这是 CentOS 7 中常见的日志来源，会持续增长。脚本中提供的 <code>journalctl</code> 命令是官方推荐的安全清理方式。</li><li><strong>YUM 软件包缓存</strong>：每次安装或更新软件时，下载的 RPM 包会留在这里。清理缓存可以释放可观的空间，且对系统无害。</li><li><strong>临时文件</strong>：<code>/tmp</code> 和 <code>/var/tmp</code> 中的文件理论上都可以删除，但为了防止意外中断正在运行的程序，建议只删除一段时间以前的旧文件。</li><li><strong>旧的内核</strong>：每次内核更新，旧版本的内核都会保留。通常保留最新的一个和前一个作为备用即可，过多的旧内核会占用 <code>/boot</code> 和 <code>/lib/modules</code> 的空间。<code>package-cleanup</code> 是安全的官方清理工具。</li><li><strong>/var/log 目录</strong>：除了 journal 日志，许多应用（如 Nginx, Apache, MySQL等）会在这里生成自己的日志。对于轮转后（rotated）的旧日志（通常以 <code>.1</code>, <code>.2.gz</code> 等结尾），可以安全删除。</li></ul></li></ol><p>通过结合使用这个脚本和您的判断，可以安全有效地清理 CentOS 7.4 服务器上的磁盘空间。</p>]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;nginx-如何限定log文件的尺寸&quot;&gt;&lt;a href=&quot;#nginx-如何限定log文件的尺寸&quot; class=&quot;headerlink&quot; title=&quot;nginx 如何限定log文件的尺寸&quot;&gt;&lt;/a&gt;nginx 如何限定log文件的尺寸&lt;/h2&gt;&lt;p&gt;要限定 Nginx 日志文件的尺寸，正确且最常用的方法并非在 Nginx 的配置文件中直接设置，因为 &lt;strong&gt;Nginx 本身没有提供按文件大小自动切割日志的功能&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;正确的做法是使用一个名为 &lt;code&gt;logrotate&lt;/code&gt; 的标准 Linux 工具。&lt;code&gt;logrotate&lt;/code&gt; 是一个强大的日志管理工具，它可以根据文件大小、时间（每天、每周、每月）等策略来自动轮转、压缩和删除日志文件。&lt;/p&gt;
    
    </summary>
    
      <category term="学习笔记" scheme="https://blogs.kainy.cn/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
      <category term="方法" scheme="https://blogs.kainy.cn/tags/%E6%96%B9%E6%B3%95/"/>
    
      <category term="服务器" scheme="https://blogs.kainy.cn/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
      <category term="运维" scheme="https://blogs.kainy.cn/tags/%E8%BF%90%E7%BB%B4/"/>
    
  </entry>
  
  <entry>
    <title>SyncMeIn App FAQ</title>
    <link href="https://blogs.kainy.cn/2025/06/SyncMeIn%20App%20FAQ/"/>
    <id>https://blogs.kainy.cn/2025/06/SyncMeIn App FAQ/</id>
    <published>2025-06-04T04:17:46.000Z</published>
    <updated>2026-08-01T09:28:07.941Z</updated>
    
    <content type="html"><![CDATA[<h2 id="1-Regarding-our-business-model"><a href="#1-Regarding-our-business-model" class="headerlink" title="1. Regarding our business model:"></a>1. Regarding our business model:</h2><ul><li>Currently, our app is completely free with no paid features. All users can access all available features without any payment.</li><li>We plan to introduce subscription features in the future, which will allow users to sync their favorite requests and configuration information across devices, but this functionality has not been implemented yet.</li><li>Account registration is completely free and optional.</li><li>There are no paid features, subscriptions, or in-app purchases in the current version.<a id="more"></a></li></ul><h2 id="2-Regarding-account-deletion"><a href="#2-Regarding-account-deletion" class="headerlink" title="2. Regarding account deletion:"></a>2. Regarding account deletion:</h2><ul><li>We have implemented an account deletion option in our app.</li><li>Users can find the “Delete Account” link at the bottom of the user profile screen after logging in.</li><li>This link directs users to our website (<a href="https://kainy.cn/SyncMeIn/privacy.html#close_my_account" target="_blank" rel="noopener">https://kainy.cn/SyncMeIn/privacy.html#close_my_account</a>) where they can complete the account deletion process.</li><li>The account deletion process is straightforward and does not require contacting customer service.</li></ul><h2 id="3-What-user-information-is-the-app-collecting-using-VPN"><a href="#3-What-user-information-is-the-app-collecting-using-VPN" class="headerlink" title="3. What user information is the app collecting using VPN?"></a>3. What user information is the app collecting using VPN?</h2><p>SyncMeIn uses a VPN configuration to intercept and inspect HTTP/HTTPS traffic for debugging and development purposes. </p><p>The app collects the following information through the VPN functionality:</p><ul><li>Network request and response data (HTTP/HTTPS traffic) that passes through the VPN</li><li>Domain names and URLs of websites and services accessed through the VPN</li><li>Request headers and response data for analysis and debugging</li><li>Connection metadata (IP addresses, ports) necessary for the proper functioning of the proxy service</li></ul><p>The app does NOT collect or store:</p><ul><li>Personal user identification information</li><li>Passwords or authentication credentials</li><li>Browsing history beyond the current session (unless explicitly saved by the user)</li><li>Device information beyond what’s necessary for VPN operation</li><li>Location data or other sensitive personal information</li></ul><h2 id="4-For-what-purposes-is-this-information-collected"><a href="#4-For-what-purposes-is-this-information-collected" class="headerlink" title="4. For what purposes is this information collected?"></a>4. For what purposes is this information collected?</h2><p>The collected information is used exclusively for the following purposes:</p><ul><li>Traffic Analysis and Debugging: To help developers inspect, analyze, and debug HTTP/HTTPS requests and responses during app development</li><li>Request Modification: To allow users to rewrite or modify requests for testing and development purposes</li><li>Domain Filtering: To selectively capture only traffic from specific domains as configured by the user</li><li>Script Execution: To enable users to run custom JavaScript scripts to process requests or responses for testing</li><li>Local History: To provide a temporary record of captured traffic for analysis within the current debugging session</li></ul><p>All data processing happens locally on the user’s device. The VPN functionality is designed as a development tool to help users debug their own applications and network traffic.</p><h2 id="5-Will-the-data-be-shared-with-any-third-parties-If-so-for-what-purposes-and-where-will-this-information-be-stored"><a href="#5-Will-the-data-be-shared-with-any-third-parties-If-so-for-what-purposes-and-where-will-this-information-be-stored" class="headerlink" title="5. Will the data be shared with any third parties? If so, for what purposes and where will this information be stored?"></a>5. Will the data be shared with any third parties? If so, for what purposes and where will this information be stored?</h2><p>No, the data collected through the VPN is not shared with any third parties. All traffic data is:</p><ul><li>Processed locally on the user’s device</li><li>Only stored temporarily in the app’s local storage</li><li>Only accessible to the user of the app</li><li>Not transmitted to external servers except when explicitly initiated by the user (e.g., when forwarding traffic to another device for debugging)</li></ul><p>The app includes user authentication functionality, but this is solely for user account management and does not involve sharing the VPN-captured traffic data with third parties.</p><p>If users choose to export their captured traffic history (in HAR format), this exported data remains under their control and is not automatically uploaded to any server.</p><h2 id="In-summary"><a href="#In-summary" class="headerlink" title="In summary"></a>In summary</h2><p>SyncMeIn is a developer tool that uses VPN functionality to provide local traffic inspection and modification capabilities, with all data processing happening on-device and no sharing of captured traffic with third parties。</p>]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;1-Regarding-our-business-model&quot;&gt;&lt;a href=&quot;#1-Regarding-our-business-model&quot; class=&quot;headerlink&quot; title=&quot;1. Regarding our business model:&quot;&gt;&lt;/a&gt;1. Regarding our business model:&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Currently, our app is completely free with no paid features. All users can access all available features without any payment.&lt;/li&gt;
&lt;li&gt;We plan to introduce subscription features in the future, which will allow users to sync their favorite requests and configuration information across devices, but this functionality has not been implemented yet.&lt;/li&gt;
&lt;li&gt;Account registration is completely free and optional.&lt;/li&gt;
&lt;li&gt;There are no paid features, subscriptions, or in-app purchases in the current version.
    
    </summary>
    
      <category term="学习笔记" scheme="https://blogs.kainy.cn/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
      <category term="SyncMeIn" scheme="https://blogs.kainy.cn/tags/SyncMeIn/"/>
    
      <category term="App" scheme="https://blogs.kainy.cn/tags/App/"/>
    
  </entry>
  
  <entry>
    <title>新线开通 低至99畅享永安厦门双城往返市区接送</title>
    <link href="https://blogs.kainy.cn/2025/05/%E6%96%B0%E7%BA%BF%E5%BC%80%E9%80%9A%20%E4%BD%8E%E8%87%B3%2099%20%E7%95%85%E4%BA%AB%E6%B0%B8%E5%AE%89%E5%8E%A6%E9%97%A8%E5%8F%8C%E5%9F%8E%E5%BE%80%E8%BF%94%E5%B8%82%E5%8C%BA%E6%8E%A5%E9%80%81/"/>
    <id>https://blogs.kainy.cn/2025/05/新线开通 低至 99 畅享永安厦门双城往返市区接送/</id>
    <published>2025-05-26T22:20:17.000Z</published>
    <updated>2026-08-01T09:28:07.954Z</updated>
    
    <content type="html"><![CDATA[<p><strong>永安⇌厦门🚌</strong> 新线开通 低至 99 畅享双城往返市区接送</p><p><strong>永安出发99起，厦门出发100起</strong></p><p>是谁还在坐170+的高铁</p><p>真的是打工人学生党难以承受之重啊aa </p><p>来回的票价都能抵上部分人半个月生活费了</p><p><strong>NO NONO！！！</strong></p><a id="more"></a><p>就这个票价还是省省吧！</p><p>不如坐我们的跨城巴士</p><p>把省下来的钱买几斤活肉跟粿条</p><p>带上独属于家乡的“思念”</p><p>再重新自信踏上归途</p><p style="font-size:45px;font-weight: bold;">微信： 171<span style="color: red;">8888</span>6673</p><p>🔥🈶车到厦门</p><p>……………………………</p><ul><li>🐠上午9:00永安到厦门</li><li>🐠下午13:30永安到厦门</li><li>🐠傍晚17:30永安到厦门</li><li>——————————</li><li>🐬下午13:30厦门-永安</li><li>🐬傍晚17:30厦门-永安</li><li>🐬晚上20:30厦门-永安</li></ul><p>……………………………</p><p>线路信息、票价等具体以订票咨询为准</p><p>坐在返程的大巴🚌上</p><p>细数路过的每个村庄🏕</p><p>再慢慢感受家乡的变化</p><p>让自己永远跟上步伐👣</p><p>即便在外工作</p><p>也不忘记家乡🏠️最初的模样~</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;strong&gt;永安⇌厦门🚌&lt;/strong&gt; 新线开通 低至 99 畅享双城往返市区接送&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;永安出发99起，厦门出发100起&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;是谁还在坐170+的高铁&lt;/p&gt;
&lt;p&gt;真的是打工人学生党难以承受之重啊aa &lt;/p&gt;
&lt;p&gt;来回的票价都能抵上部分人半个月生活费了&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NO NONO！！！&lt;/strong&gt;&lt;/p&gt;
    
    </summary>
    
      <category term="东写西读" scheme="https://blogs.kainy.cn/categories/%E4%B8%9C%E5%86%99%E8%A5%BF%E8%AF%BB/"/>
    
      <category term="生活点滴" scheme="https://blogs.kainy.cn/categories/%E4%B8%9C%E5%86%99%E8%A5%BF%E8%AF%BB/%E7%94%9F%E6%B4%BB%E7%82%B9%E6%BB%B4/"/>
    
    
      <category term="永安" scheme="https://blogs.kainy.cn/tags/%E6%B0%B8%E5%AE%89/"/>
    
      <category term="交通" scheme="https://blogs.kainy.cn/tags/%E4%BA%A4%E9%80%9A/"/>
    
  </entry>
  
  <entry>
    <title>躺赚新姿势？我无心插柳的API，竟成他人日入数百的“印钞机”！</title>
    <link href="https://blogs.kainy.cn/2025/05/%E8%BA%BA%E8%B5%9A%E6%96%B0%E5%A7%BF%E5%8A%BF%EF%BC%9F%E6%88%91%E6%97%A0%E5%BF%83%E6%8F%92%E6%9F%B3%E7%9A%84API%EF%BC%8C%E7%AB%9F%E6%88%90%E4%BB%96%E4%BA%BA%E6%97%A5%E5%85%A5%E6%95%B0%E7%99%BE%E7%9A%84%E2%80%9C%E5%8D%B0%E9%92%9E%E6%9C%BA%E2%80%9D%EF%BC%81/"/>
    <id>https://blogs.kainy.cn/2025/05/躺赚新姿势？我无心插柳的API，竟成他人日入数百的“印钞机”！/</id>
    <published>2025-05-19T04:03:13.000Z</published>
    <updated>2026-08-01T09:28:07.965Z</updated>
    
    <content type="html"><![CDATA[<p>给大家分享一个我最近遇到的真实案例，简直让我拍案叫绝，也深深感受到了“信息差”这玩意儿，在赚钱这件事上到底有多牛逼！</p><p>事情是这样的，前段时间我借助 <a href="https://blogs.kainy.cn/tags/%E7%BD%91%E5%85%B3/#blogs_xy">Open API</a>，搭建了一个携程酒店的优惠查询页面。初衷很简单：就是方便自己和朋友们五一出行时能快速找到特价酒店。令我惊喜的是，这个接口覆盖面还挺广，连我老家永安那样的小县城，都能搜到优惠酒店。</p><p><img src="https://oray.kainy.cn:38400/_upload/./content/temp/174766670662175445789abc72cfa1b33350a5489eee2.jpg" alt="OpenSZ特惠酒店查询"></p><p>因为这个API只是转发查询上游数据，本身几乎没什么服务器成本，所以我把查询价格定得非常低，几乎可以忽略不计。</p><p>然而，就在这两天，我却突然发现这个页面的API调用量激增，有点反常。好奇心驱使下，我开始追查原因。你猜怎么着？最后竟然在闲鱼上找到了答案！</p><a id="more"></a><p><strong>一个“平平无奇”的发现，背后竟是“商业鬼才”！</strong></p><p>有人，竟然利用我这个小小的优惠查询页面，在闲鱼上做起了大生意！他在闲鱼上发布了大量的各地优惠酒店信息，每一条信息的查询服务，直接标价10元！</p><p>你没看错，就是10块钱！而且，从他商品的咨询量和成交情况来看，想要获取这些优惠信息的人还真不少。</p><p><img src="https://oray.kainy.cn:38400/_upload/./content/temp/1747666121604xianyu.jpeg" style="width:40%"></p><p><strong>我们来算一笔账，感受一下什么叫“认知变现”：</strong></p><p>我的这个查询页面是这个月正式上线的。我们假设这位在闲鱼开店的朋友，是从我的页面上线后不久开始运营他的“优惠酒店信息”小铺的，就算他只运营了短短10天。</p><ul><li><strong>他的收入</strong>：每条信息卖10元。从闲鱼上看到的咨询量和潜在成交量来看，保守估计，一天成交几十单并非难事。这意味着，这个小店每天的进账，可能就高达数百元！短短10天，可能就已经轻松入账数千元。</li><li><strong>我的收入</strong>：我这边呢？每一次API调用，我可能只赚几分钱。</li></ul><p>看到这里，你是不是也和我一样，有点哭笑不得，又有点恍然大悟？</p><p><strong>同样的工具，不同的玩法，收入天差地别！</strong></p><p>这位闲鱼卖家，无疑是深谙“信息差赚钱”的个中好手。他巧妙地利用了我提供的低成本工具，将其包装成高价值的“优惠信息”，精准地对接了那些有需求但又不知道如何或者懒得去查找优惠信息的客户。</p><ul><li><strong>他赚的是信息不对称的钱</strong>：很多人不知道有这样的查询工具，或者即便知道，也可能因为操作不熟练、没有时间等原因，宁愿花点小钱直接获取结果。</li><li><strong>他赚的是服务整合的钱</strong>：他将分散的优惠信息整合起来，以商品的形式在闲鱼这个流量巨大的平台进行曝光和售卖。</li><li><strong>他赚的是认知领先的钱</strong>：他看到了这个工具背后潜在的商业价值，并迅速行动，将其转化为实实在在的收益。</li></ul><p>而我，虽然是工具的创建者，却只是停留在“提供工具，赚取微薄调用费”的层面。我们之间的收入差距，不是技术上的差距，而是赚钱认知上的鸿沟。不得不承认，有些人，天生就擅长发现并抓住赚钱的机会！</p><p>这个案例给我上了生动的一课：<strong>很多时候，我们缺的不是资源，不是技术，而是发现价值的眼睛和将信息转化为财富的商业头脑。</strong></p><p>你是否也曾有过类似的“我怎么没想到”的时刻？是否也曾因为一个小小的创意或工具，被别人玩出了花，赚得盆满钵满？</p><p>这个世界从不缺少机会，缺的是发现机会并付诸行动的人。</p><p><strong>看到这里，你是否也对这个“躺赚”模式背后的查询工具产生了浓厚的兴趣？</strong></p><p>想不想亲自体验一下，连犄角旮旯的小城优惠酒店都能轻松挖到的快感？想不想也尝试一下，利用信息差，找到属于自己的赚钱新思路？</p><p><strong>福利来了！</strong></p><p>对这个项目感兴趣，想要获取同款【<strong>携程酒店优惠查询工具</strong>】的朋友，请在评论区留言 <strong>“666”</strong>！</p><p>我会把工具链接发给你，助你打开新世界的大门！说不定，下一个在闲鱼日入数百的就是你！</p><p>期待你的评论，让我们一起探讨更多利用信息差赚钱的“骚操作”！</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;给大家分享一个我最近遇到的真实案例，简直让我拍案叫绝，也深深感受到了“信息差”这玩意儿，在赚钱这件事上到底有多牛逼！&lt;/p&gt;
&lt;p&gt;事情是这样的，前段时间我借助 &lt;a href=&quot;https://blogs.kainy.cn/tags/%E7%BD%91%E5%85%B3/#blogs_xy&quot;&gt;Open API&lt;/a&gt;，搭建了一个携程酒店的优惠查询页面。初衷很简单：就是方便自己和朋友们五一出行时能快速找到特价酒店。令我惊喜的是，这个接口覆盖面还挺广，连我老家永安那样的小县城，都能搜到优惠酒店。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://oray.kainy.cn:38400/_upload/./content/temp/174766670662175445789abc72cfa1b33350a5489eee2.jpg&quot; alt=&quot;OpenSZ特惠酒店查询&quot;&gt;&lt;/p&gt;
&lt;p&gt;因为这个API只是转发查询上游数据，本身几乎没什么服务器成本，所以我把查询价格定得非常低，几乎可以忽略不计。&lt;/p&gt;
&lt;p&gt;然而，就在这两天，我却突然发现这个页面的API调用量激增，有点反常。好奇心驱使下，我开始追查原因。你猜怎么着？最后竟然在闲鱼上找到了答案！&lt;/p&gt;
    
    </summary>
    
      <category term="学习笔记" scheme="https://blogs.kainy.cn/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
      <category term="网关" scheme="https://blogs.kainy.cn/tags/%E7%BD%91%E5%85%B3/"/>
    
      <category term="项目" scheme="https://blogs.kainy.cn/tags/%E9%A1%B9%E7%9B%AE/"/>
    
      <category term="闲鱼" scheme="https://blogs.kainy.cn/tags/%E9%97%B2%E9%B1%BC/"/>
    
  </entry>
  
</feed>
