<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>LOOK</title><description>AI 工具 · 前端工程 · 技术折腾</description><link>https://blog.961121.xyz/</link><language>zh_CN</language><item><title>PortLoom 教程：用一台 VPS 把 NAS 服务发布到公网</title><link>https://blog.961121.xyz/posts/portloom-nas-public-access-tutorial/</link><guid isPermaLink="true">https://blog.961121.xyz/posts/portloom-nas-public-access-tutorial/</guid><description>PortLoom 是一个自托管的内网穿透工具。本文从 DNS、VPS Server、NAS Agent 到 HTTPS 路由，完整演示如何在不开放 NAS 入站端口的情况下发布 Jellyfin 等 Web 服务。</description><pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;家里的 NAS 跑了 Jellyfin、相册、下载工具和各种管理页面，但家庭宽带没有稳定公网入口。常见处理办法是手写 SSH 反向隧道，再配一层 Nginx 或 Caddy。服务少的时候还能维护，服务一多，端口、域名、隧道状态和配置文件很快就会乱。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/lkhmm520/portloom&quot;&gt;PortLoom&lt;/a&gt; 把这套流程做成了一个 Web 控制台。公网 VPS 负责接收 HTTPS 请求，NAS 上的 Agent 主动连接 VPS，再把流量送回本地服务。NAS 不需要开放入站端口，也不用在路由器上逐个做端口转发。&lt;/p&gt;
&lt;p&gt;本文使用当前正式版 &lt;a href=&quot;https://github.com/lkhmm520/portloom/releases/tag/v0.2.1&quot;&gt;v0.2.1&lt;/a&gt;。下面的域名和 IP 都是示例，部署时换成自己的值。&lt;/p&gt;
&lt;h2&gt;PortLoom 的工作方式&lt;/h2&gt;
&lt;p&gt;PortLoom 需要两台能运行 Docker Compose 的 Linux 主机：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;位置&lt;/th&gt;
&lt;th&gt;安装内容&lt;/th&gt;
&lt;th&gt;用途&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;公网 VPS&lt;/td&gt;
&lt;td&gt;Server、专用 SSHD、Caddy&lt;/td&gt;
&lt;td&gt;WebUI、HTTPS 入口、路由网关和隧道入口&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NAS 或内网服务器&lt;/td&gt;
&lt;td&gt;Agent&lt;/td&gt;
&lt;td&gt;主动连接 VPS，并把请求转发给本地服务&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;一次访问大致会经过这条链路：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;浏览器
  │ HTTPS
  ▼
公网 VPS
  Caddy → PortLoom Gateway
                    │
                    │ SSH 反向隧道
                    ▼
内网 NAS
  PortLoom Agent → Jellyfin / 相册 / 管理页面
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Agent 只向外连接 VPS 的 HTTPS 和 SSH 端口。公网请求沿已经建立的加密隧道返回 NAS，因此家庭网络不需要公网 IPv4，也不需要把 NAS 的服务端口直接暴露出去。&lt;/p&gt;
&lt;p&gt;PortLoom 当前完整管理的是 HTTP/HTTPS 域名路由。它不会替你发布任意原始 TCP 端口。如果要暴露数据库、游戏端口或其他 TCP 服务，需要另找合适的方案。&lt;/p&gt;
&lt;h2&gt;开始前要准备什么&lt;/h2&gt;
&lt;h3&gt;1. 公网 VPS&lt;/h3&gt;
&lt;p&gt;VPS 需要：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一个稳定的公网 IP&lt;/li&gt;
&lt;li&gt;Linux 系统&lt;/li&gt;
&lt;li&gt;Docker Engine&lt;/li&gt;
&lt;li&gt;Docker Compose v2&lt;/li&gt;
&lt;li&gt;TCP &lt;code&gt;80&lt;/code&gt;、&lt;code&gt;443&lt;/code&gt; 和 &lt;code&gt;2222&lt;/code&gt; 可以从公网访问&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;80/443&lt;/code&gt; 由 Caddy 处理 HTTPS，&lt;code&gt;2222&lt;/code&gt; 是 PortLoom 专用 SSH 隧道端口。&lt;/p&gt;
&lt;h3&gt;2. NAS 或内网服务器&lt;/h3&gt;
&lt;p&gt;NAS 需要能运行 Docker Compose，并且可以主动访问 VPS 的 &lt;code&gt;443&lt;/code&gt; 和 &lt;code&gt;2222&lt;/code&gt; 端口。NAS 端不需要放行公网入站端口。&lt;/p&gt;
&lt;h3&gt;3. 域名和 DNS&lt;/h3&gt;
&lt;p&gt;假设：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VPS 公网 IP：&lt;code&gt;203.0.113.10&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;PortLoom 管理域名：&lt;code&gt;portloom.example.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;准备发布的 Jellyfin 域名：&lt;code&gt;jellyfin.example.com&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;添加两条 DNS 记录：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;portloom.example.com  A  203.0.113.10
*.example.com         A  203.0.113.10
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;通配符记录不是强制的，也可以给每个服务单独添加 A 记录。使用 Cloudflare 时，第一次部署建议先设为“仅 DNS”（灰云），避免 SSH 端口和证书签发被代理状态干扰。&lt;/p&gt;
&lt;p&gt;确认解析结果：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nslookup portloom.example.com
nslookup jellyfin.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;两次查询都应该返回 VPS 的公网 IP。&lt;/p&gt;
&lt;h2&gt;在 VPS 安装 PortLoom Server&lt;/h2&gt;
&lt;p&gt;先下载脚本并查看内容，再执行安装。这里固定使用 &lt;code&gt;0.2.1&lt;/code&gt;，避免日后 &lt;code&gt;latest&lt;/code&gt; 更新后教程与实际版本对不上。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -fsSLo install-server.sh https://docs.961121.xyz/install-server.sh
less install-server.sh
chmod 0700 install-server.sh
./install-server.sh \
  --domain portloom.example.com \
  --version 0.2.1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装器会启动三个容器：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;portloom-server&lt;/code&gt;：WebUI、API 和路由网关&lt;/li&gt;
&lt;li&gt;&lt;code&gt;portloom-sshd&lt;/code&gt;：专门用于反向隧道的受限 SSH 服务&lt;/li&gt;
&lt;li&gt;&lt;code&gt;portloom-caddy&lt;/code&gt;：自动申请和续期 HTTPS 证书&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;默认安装目录是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~/.portloom/server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装完成后，终端会显示：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WebUI 地址&lt;/li&gt;
&lt;li&gt;随机生成的管理员 Token&lt;/li&gt;
&lt;li&gt;配置文件目录&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::warning
管理员 Token 相当于控制台密码。不要放进截图、博客、聊天记录或公开仓库。建议立即保存到密码管理器，服务器上的 &lt;code&gt;.env&lt;/code&gt; 也要保持私有。
:::&lt;/p&gt;
&lt;p&gt;用下面的命令查看容器状态：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd ~/.portloom/server
docker compose --env-file .env -f compose.yml ps
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;三个容器都正常后，在浏览器打开：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://portloom.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输入安装器输出的管理员 Token 登录。&lt;/p&gt;
&lt;h2&gt;在 WebUI 添加 NAS&lt;/h2&gt;
&lt;p&gt;登录后进入“添加代理”页面，填写：&lt;/p&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;code&gt;home-nas&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Server URL&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://portloom.example.com&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;公网 Server 主机&lt;/td&gt;
&lt;td&gt;&lt;code&gt;portloom.example.com&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSH 隧道端口&lt;/td&gt;
&lt;td&gt;&lt;code&gt;2222&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;点击“生成命令”。WebUI 会生成一条完整安装命令，其中包含一次性注册令牌和已经核验的 SSH 主机公钥。&lt;/p&gt;
&lt;p&gt;这条命令只显示一次，不要自己拆开修改，也不要把它发到公开的地方。&lt;/p&gt;
&lt;h2&gt;在 NAS 安装 Agent&lt;/h2&gt;
&lt;p&gt;SSH 登录 NAS，把 WebUI 生成的完整命令原样执行。它会下载 &lt;code&gt;install-agent.sh&lt;/code&gt;，并安装与 Server 相同版本的 Agent。&lt;/p&gt;
&lt;p&gt;安装过程会自动完成这些事情：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;生成独立 Ed25519 密钥&lt;/li&gt;
&lt;li&gt;写入 Server 的 SSH 主机公钥&lt;/li&gt;
&lt;li&gt;使用一次性令牌注册 Agent&lt;/li&gt;
&lt;li&gt;上传 Agent 公钥并更新受限授权文件&lt;/li&gt;
&lt;li&gt;建立反向隧道&lt;/li&gt;
&lt;li&gt;注册成功后，从环境文件中删除一次性令牌&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;默认安装目录是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~/.portloom/agent
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看 Agent 状态：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd ~/.portloom/agent
docker compose --env-file .env -f compose.yml ps
docker compose --env-file .env -f compose.yml logs --tail=100 agent
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;回到 WebUI 的“客户端”页面，应该能看到 &lt;code&gt;home-nas&lt;/code&gt;，并且心跳时间会持续更新。&lt;/p&gt;
&lt;h2&gt;发布第一个服务&lt;/h2&gt;
&lt;p&gt;下面以 Jellyfin 为例。假设 Jellyfin 在 NAS 上监听 &lt;code&gt;8096&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;进入“路由”，点击“添加 HTTP 路由”，填写：&lt;/p&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;code&gt;Jellyfin&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;客户端&lt;/td&gt;
&lt;td&gt;&lt;code&gt;home-nas&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;协议&lt;/td&gt;
&lt;td&gt;&lt;code&gt;HTTP&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;公网域名&lt;/td&gt;
&lt;td&gt;&lt;code&gt;jellyfin.example.com&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;本地主机&lt;/td&gt;
&lt;td&gt;&lt;code&gt;127.0.0.1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;本地端口&lt;/td&gt;
&lt;td&gt;&lt;code&gt;8096&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Agent 使用 host network，因此这里的 &lt;code&gt;127.0.0.1&lt;/code&gt; 指 NAS 宿主机。如果目标服务在另一台局域网设备上，也可以填写对应的 LAN 地址，例如 &lt;code&gt;192.168.1.20&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;保存后，PortLoom 会分配 VPS 回环端口、建立 SSH 反向转发，并把域名加入 Gateway。Caddy 只会为 WebUI 中已经启用的 HTTP 路由提供入口。&lt;/p&gt;
&lt;p&gt;等待状态收敛后访问：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://jellyfin.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果页面能打开，说明第一条路由已经打通。&lt;/p&gt;
&lt;h2&gt;怎么看懂三层状态&lt;/h2&gt;
&lt;p&gt;PortLoom 没有把所有问题压成一个绿色圆点，而是分成三层：&lt;/p&gt;
&lt;h3&gt;Local&lt;/h3&gt;
&lt;p&gt;Agent 能否访问 &lt;code&gt;local_host:local_port&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;如果 Local down，先在 NAS 上检查：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -I http://127.0.0.1:8096
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果这里就不通，问题通常在本地服务、监听地址、端口或 NAS 防火墙，与 VPS 和域名无关。&lt;/p&gt;
&lt;h3&gt;Tunnel&lt;/h3&gt;
&lt;p&gt;SSH 反向转发是否已经建立。Tunnel down 常见原因包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;NAS 无法访问 VPS 的 &lt;code&gt;2222&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;SSH 密钥或 &lt;code&gt;known_hosts&lt;/code&gt; 权限不正确&lt;/li&gt;
&lt;li&gt;VPS 防火墙没有放行 &lt;code&gt;2222&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;远程端口冲突&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Public&lt;/h3&gt;
&lt;p&gt;Agent 是否已经应用最新配置，以及内置 Gateway 是否已经收敛。&lt;/p&gt;
&lt;p&gt;Public 显示 published，不代表外部 DNS 和 TLS 一定正确。如果 Local、Tunnel、Public 都正常，但公网仍打不开，就继续检查域名解析、VPS 的 &lt;code&gt;80/443&lt;/code&gt; 防火墙和 Caddy 日志。&lt;/p&gt;
&lt;h2&gt;常见故障怎么排&lt;/h2&gt;
&lt;p&gt;按链路从近到远检查，通常比反复重装更快。&lt;/p&gt;
&lt;h3&gt;1. 控制台打不开&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;cd ~/.portloom/server
docker compose --env-file .env -f compose.yml ps
docker compose --env-file .env -f compose.yml logs --tail=100 server
docker compose --env-file .env -f compose.yml logs --tail=100 caddy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;确认 DNS 指向 VPS，并检查 &lt;code&gt;80/443&lt;/code&gt; 是否放行。&lt;/p&gt;
&lt;h3&gt;2. Agent 无法注册&lt;/h3&gt;
&lt;p&gt;检查：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一次性令牌是否已经使用或过期&lt;/li&gt;
&lt;li&gt;NAS 和 VPS 的系统时间是否正确&lt;/li&gt;
&lt;li&gt;NAS 是否能访问管理域名的 HTTPS&lt;/li&gt;
&lt;li&gt;Agent 数据目录是否持久化且可写&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注册命令失败后不要删除 Agent 状态目录。修好网络后，先重新执行同一条安装命令，安装器会尝试安全恢复。&lt;/p&gt;
&lt;h3&gt;3. Gateway 返回 404&lt;/h3&gt;
&lt;p&gt;一般是 Host 没有匹配到路由。检查公网域名是否填写正确、路由是否启用，以及请求使用的域名是否和 WebUI 完全一致。&lt;/p&gt;
&lt;h3&gt;4. Gateway 返回 502&lt;/h3&gt;
&lt;p&gt;这通常表示 VPS 侧没有可用的隧道监听。先看 Tunnel 状态和 Agent 日志，不要先删除路由或数据库。&lt;/p&gt;
&lt;h3&gt;5. 页面能开，但视频或大文件异常&lt;/h3&gt;
&lt;p&gt;首页返回 200 只说明基础链路可用。媒体服务还要验证：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;大文件连续下载&lt;/li&gt;
&lt;li&gt;HTTP Range 请求&lt;/li&gt;
&lt;li&gt;WebSocket（如果应用需要）&lt;/li&gt;
&lt;li&gt;长连接&lt;/li&gt;
&lt;li&gt;实际上行带宽&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;备份和升级&lt;/h2&gt;
&lt;p&gt;Server 使用 SQLite 保存配置。零停机备份时应该使用 SQLite 在线备份 API；如果直接复制数据库文件，应先停止 Server，或者同时一致地保存数据库、WAL 和 SHM 文件。&lt;/p&gt;
&lt;p&gt;至少备份这些内容：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Server 数据目录&lt;/li&gt;
&lt;li&gt;Agent 的 &lt;code&gt;data/agent.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Agent SSH 私钥和 &lt;code&gt;known_hosts&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Server 与 Agent 的 &lt;code&gt;.env&lt;/code&gt;、&lt;code&gt;compose.yml&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;升级前先看对应版本的 Release Notes，并固定明确的镜像标签。不要在生产环境长期依赖浮动的 &lt;code&gt;latest&lt;/code&gt;。一次只升级一个组件，先 Server，再普通 Web Agent，最后处理高流量 Agent；每一步都检查心跳、Revision 和公网请求。&lt;/p&gt;
&lt;p&gt;官方升级与回滚说明：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.961121.xyz/operations/backup-upgrade&quot;&gt;https://docs.961121.xyz/operations/backup-upgrade&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;几个安全细节&lt;/h2&gt;
&lt;p&gt;PortLoom 已经把 Server、SSHD 和 Agent 拆开，并对容器做了非 root 运行、只读根文件系统和能力裁剪，但部署者仍需要保护好凭据：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不要公开管理员 Token&lt;/li&gt;
&lt;li&gt;不要把一次性注册命令发给别人&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.env&lt;/code&gt;、SSH 私钥和备份目录使用严格权限&lt;/li&gt;
&lt;li&gt;不要让 PortLoom 容器访问 Docker Socket&lt;/li&gt;
&lt;li&gt;管理域名只使用 HTTPS&lt;/li&gt;
&lt;li&gt;删除路由或重建数据前先备份&lt;/li&gt;
&lt;li&gt;不要把删除 SQLite、Agent 状态目录或重新注册当成首选排错手段&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PortLoom 的管理域名同时承载 Agent API。如果还要叠加来源 IP 限制、VPN 或身份验证网关，必须保证 NAS 仍能访问 Agent 所需的 API；不要直接给整个域名套一层只适合浏览器的登录页，否则心跳和配置同步也会被拦截。&lt;/p&gt;
&lt;h2&gt;适合哪些场景&lt;/h2&gt;
&lt;p&gt;PortLoom 适合把这些 Web 服务发布出去：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Jellyfin、Emby 等媒体服务&lt;/li&gt;
&lt;li&gt;自建博客和静态站点&lt;/li&gt;
&lt;li&gt;NAS 相册、文件管理页面&lt;/li&gt;
&lt;li&gt;Home Assistant 等家庭服务&lt;/li&gt;
&lt;li&gt;内网开发环境和测试页面&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果只发布一个临时页面，手写一条 SSH 隧道可能更快。服务多、域名多，或者希望在一个界面里看清本地、隧道和公网状态时，PortLoom 会省下不少重复配置。&lt;/p&gt;
&lt;p&gt;项目和文档地址：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GitHub：&lt;a href=&quot;https://github.com/lkhmm520/portloom&quot;&gt;https://github.com/lkhmm520/portloom&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;中文文档：&lt;a href=&quot;https://docs.961121.xyz/&quot;&gt;https://docs.961121.xyz/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;v0.2.1 Release：&lt;a href=&quot;https://github.com/lkhmm520/portloom/releases/tag/v0.2.1&quot;&gt;https://github.com/lkhmm520/portloom/releases/tag/v0.2.1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>VPS 购买、重装 Ubuntu 与 3X-UI 面板搭建教程</title><link>https://blog.961121.xyz/posts/bandwagonhost-vps-x-ui-guide/</link><guid isPermaLink="true">https://blog.961121.xyz/posts/bandwagonhost-vps-x-ui-guide/</guid><description>以搬瓦工为例，记录 VPS 购买、系统重装、SSH 连接、3X-UI 面板安装，以及 VLESS + REALITY 入站配置的完整流程。</description><pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;这篇教程记录一次从零开始搭建 VPS 的完整流程：购买服务器、重装 Ubuntu、用 Termius SSH 连接服务器，最后安装 3X-UI 面板并创建 VLESS + REALITY 入站。&lt;/p&gt;
&lt;p&gt;截图和步骤主要以搬瓦工为例。其他 VPS 商家的后台入口会不一样，但核心流程基本相同：购买实例、拿到公网 IP、重装或选择系统、通过 SSH 登录，然后安装面板。&lt;/p&gt;
&lt;p&gt;开始之前先准备好：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一个可接收邮件的邮箱&lt;/li&gt;
&lt;li&gt;一个可完成海外网站付款的支付方式，不同商家的可用付款方式以结算页为准&lt;/li&gt;
&lt;li&gt;一台电脑，用来安装 Termius 并 SSH 连接服务器&lt;/li&gt;
&lt;li&gt;如果选择 DMIT，提前准备一组 SSH 密钥，DMIT 主要通过 SSH key 登录服务器&lt;/li&gt;
&lt;li&gt;可选：一个已经解析到服务器 IP 的域名，用来后续开启 TLS&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;提醒：VPS、域名和代理相关服务请遵守所在地法律法规以及服务商条款。本文只记录服务器自主管理和面板部署流程，页面选项、价格和可售机房可能会变化，以实际页面为准。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;购买 VPS（以搬瓦工为例）&lt;/h2&gt;
&lt;p&gt;新手自用可以优先看两家：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;搬瓦工：后台简单，KiwiVM 控制台好上手，适合第一次买 VPS 的用户。&lt;/li&gt;
&lt;li&gt;DMIT：网络质量和线路选择也不错，更偏向熟悉 SSH key 的用户。DMIT 购买入口：&lt;a href=&quot;https://www.dmit.io/aff.php?aff=24112&quot;&gt;https://www.dmit.io/aff.php?aff=24112&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下面的截图统一以搬瓦工为例。打开搬瓦工购买入口：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://bandwagonhost.com/aff.php?aff=81515&quot;&gt;https://bandwagonhost.com/aff.php?aff=81515&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;进入页面后，选择 VPS 套餐。新手自用直接买最便宜的一档就够了，机房推荐选择 &lt;strong&gt;Los Angeles / 洛杉矶&lt;/strong&gt;。如果页面里有多个洛杉矶机房或多个套餐，优先选价格最低、带宽和流量够用的一档。DMIT 或其他商家的下单逻辑也类似，重点是确认机房、套餐、流量和付款周期。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./01-bandwagon-plan.png&quot; alt=&quot;图1：选择 Basic VPS、Los Angeles 机房，并点击最便宜套餐的 Order&quot; /&gt;&lt;/p&gt;
&lt;p&gt;下单时注意这些信息：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Location / 机房&lt;/strong&gt;：推荐 Los Angeles&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Billing cycle / 付款周期&lt;/strong&gt;：按自己预算选择，年付通常更省事&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Operating System / 系统&lt;/strong&gt;：搬瓦工一般是在服务开通后进入 KiwiVM 再重装系统，这里按页面实际提示操作&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;确认套餐后点击 &lt;strong&gt;Order&lt;/strong&gt;，进入注册和结算页面。&lt;/p&gt;
&lt;h2&gt;注册账号并完成支付&lt;/h2&gt;
&lt;p&gt;注册时按页面要求填写个人信息即可。手机号需要带国际区号，中国大陆手机号前面加 &lt;code&gt;86&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./02-bandwagon-register.png&quot; alt=&quot;图2：注册账号时填写个人信息并同意服务条款&quot; /&gt;&lt;/p&gt;
&lt;p&gt;常见填写方式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;First Name：名字&lt;/li&gt;
&lt;li&gt;Last Name：姓氏&lt;/li&gt;
&lt;li&gt;Email Address：邮箱&lt;/li&gt;
&lt;li&gt;Password：账号密码&lt;/li&gt;
&lt;li&gt;Country or territory：选择所在国家或地区&lt;/li&gt;
&lt;li&gt;Phone Number：填写带国际区号的手机号，例如 &lt;code&gt;8613800000000&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;阅读并勾选 Terms of Service 后提交订单。支付方式可以选择支付宝或银联，按支付页面完成付款。&lt;/p&gt;
&lt;p&gt;购买成功后，点击右上角 &lt;strong&gt;Client Area&lt;/strong&gt; 登录客户后台。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./03-bandwagon-client-area.png&quot; alt=&quot;图3：购买成功后从右上角进入 Client Area&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;进入 My Services 并打开 KiwiVM&lt;/h2&gt;
&lt;p&gt;登录 Client Area 后，按下面路径找到刚购买的 VPS：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;顶部菜单选择 &lt;strong&gt;Services&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;点击 &lt;strong&gt;My Services&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;./04-bandwagon-my-services.png&quot; alt=&quot;图4：在 Client Area 中打开 Services 下的 My Services&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在服务列表中找到刚购买的 VPS&lt;/li&gt;
&lt;li&gt;点击 &lt;strong&gt;Manage&lt;/strong&gt; 列里的齿轮图标&lt;/li&gt;
&lt;li&gt;在弹出的菜单中选择 &lt;strong&gt;Open KiwiVM&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;./05-bandwagon-open-kiwivm.png&quot; alt=&quot;图5：在服务列表中点击齿轮菜单并选择 Open KiwiVM&quot; /&gt;&lt;/p&gt;
&lt;p&gt;KiwiVM 是搬瓦工的 VPS 控制台，可以在里面查看 IP、重装系统、重启服务器、查看流量和管理基础设置，后面的操作基本都在这里完成。&lt;/p&gt;
&lt;h2&gt;重装 Ubuntu 22.04&lt;/h2&gt;
&lt;p&gt;进入 KiwiVM 后，先在右侧主控制区域暂停当前系统：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./06-kiwivm-main-controls.png&quot; alt=&quot;图6：KiwiVM 主控制台中先点击 Stop，再进入 Install new OS&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;点击 &lt;strong&gt;Stop&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;等待服务器状态变为停止&lt;/li&gt;
&lt;li&gt;左侧菜单选择 &lt;strong&gt;Install new OS&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;系统列表选择 &lt;code&gt;ubuntu-22.04-x86_64&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;勾选确认会清空当前服务器数据的选项&lt;/li&gt;
&lt;li&gt;点击重装按钮并等待系统安装完成&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;./07-kiwivm-install-ubuntu.png&quot; alt=&quot;图7：Install new OS 页面中选择 ubuntu-22.04-x86_64&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这里推荐 Ubuntu 22.04 x86_64，兼容性好，后续跑安装脚本也更省心。&lt;/p&gt;
&lt;p&gt;重装过程中页面会生成新的 &lt;code&gt;root&lt;/code&gt; 密码。这个密码只展示一次，务必马上复制保存到本地密码管理器或安全笔记里，后续 SSH 连接服务器时会用到。&lt;/p&gt;
&lt;p&gt;系统安装完成后，回到 KiwiVM 主页面，记录下面几项信息：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Public IP address：服务器 IP&lt;/li&gt;
&lt;li&gt;SSH Port：一般是 &lt;code&gt;22&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Operating system：确认已经是 Ubuntu 22.04 x86_64&lt;/li&gt;
&lt;li&gt;root 密码：刚才安装系统时页面展示的密码&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;安装 Termius 并连接 VPS&lt;/h2&gt;
&lt;p&gt;拿到 IP 和 root 密码后，就可以从本地电脑连上服务器了。Termius 是一个常用的 SSH 工具。搬瓦工重装系统后通常会给 &lt;code&gt;root&lt;/code&gt; 密码，可以直接用密码登录；DMIT 更常见的方式是先在后台上传或选择 SSH 公钥，开通后用对应的私钥登录。&lt;/p&gt;
&lt;p&gt;官网地址：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://termius.com/index.html&quot;&gt;https://termius.com/index.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;如果你买的是搬瓦工，下载并注册 Termius 后，按下面步骤添加服务器：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./08-termius-new-host.png&quot; alt=&quot;图8：Termius 中点击 New host 新增服务器&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开 Termius&lt;/li&gt;
&lt;li&gt;点击 &lt;strong&gt;New host&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;弹窗出现时选择 &lt;strong&gt;ADD &amp;amp; CONTINUE&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Address 填写 KiwiVM 里看到的服务器 IP&lt;/li&gt;
&lt;li&gt;SSH Port 保持 &lt;code&gt;22&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Username 填写 &lt;code&gt;root&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Password 填写重装系统时保存的 root 密码&lt;/li&gt;
&lt;li&gt;点击 &lt;strong&gt;Connect&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;./09-termius-host-config.png&quot; alt=&quot;图9：在 Termius 中填写服务器 IP、root 用户名和 root 密码后连接&quot; /&gt;&lt;/p&gt;
&lt;p&gt;第一次连接时如果出现主机指纹确认提示，确认 IP 没填错后选择继续。看到终端命令行，就说明已经成功登录服务器。&lt;/p&gt;
&lt;p&gt;如果你买的是 DMIT，在创建 VPS 时一般要先添加 SSH public key。服务器开通后，在 Termius 里新建 Host：Address 填 DMIT 分配的公网 IP，Username 通常填 &lt;code&gt;root&lt;/code&gt;，认证方式选择 Key，并导入与你后台公钥对应的私钥。私钥不要发给别人，也不要上传到不可信的网盘或聊天工具。&lt;/p&gt;
&lt;h2&gt;安装 3X-UI 面板&lt;/h2&gt;
&lt;p&gt;连接到服务器后，建议先更新系统软件包：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt update -y &amp;amp;&amp;amp; apt upgrade -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后安装 &lt;code&gt;curl&lt;/code&gt;，并执行 3X-UI 官方一键安装命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt install -y curl
bash &amp;lt;(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个脚本来自 &lt;code&gt;MHSanaei/3x-ui&lt;/code&gt; 项目，官方教程入口是：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/MHSanaei/3x-ui/wiki&quot;&gt;https://github.com/MHSanaei/3x-ui/wiki&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;安装过程中脚本会引导完成面板设置，并生成或要求确认面板账号、密码和访问路径。不管是脚本自动生成还是自己设置的，这几项都要保存好：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;面板访问地址&lt;/li&gt;
&lt;li&gt;面板端口&lt;/li&gt;
&lt;li&gt;面板访问路径&lt;/li&gt;
&lt;li&gt;面板账号&lt;/li&gt;
&lt;li&gt;面板密码&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;安装完成后，终端会输出面板地址，通常类似下面这种格式：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://服务器IP:面板端口/面板路径
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在浏览器中打开这个地址，输入刚才保存的账号密码登录 3X-UI。登录后如果界面不是中文，可以在面板设置中切换语言。&lt;/p&gt;
&lt;p&gt;如果忘记地址、账号或密码，可以在服务器终端执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;x-ui
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;进入管理菜单后选择查看面板设置，或按菜单提示重置账号密码。&lt;/p&gt;
&lt;p&gt;如果无法打开面板，优先检查：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;服务器 IP 是否填写正确&lt;/li&gt;
&lt;li&gt;面板端口是否复制完整&lt;/li&gt;
&lt;li&gt;面板路径是否复制完整&lt;/li&gt;
&lt;li&gt;KiwiVM 中服务器是否处于 Running 状态&lt;/li&gt;
&lt;li&gt;本地网络是否能访问该 IP&lt;/li&gt;
&lt;li&gt;服务器防火墙是否放行了面板端口&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;添加入站节点&lt;/h2&gt;
&lt;p&gt;面板能正常登录后，就可以创建第一个节点了。进入左侧 &lt;strong&gt;入站列表&lt;/strong&gt;，点击 &lt;strong&gt;添加入站&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./10-xui-reality-inbound.png&quot; alt=&quot;图10：3X-UI 添加入站时选择 VLESS + REALITY 安全配置&quot; /&gt;&lt;/p&gt;
&lt;p&gt;新手建议直接创建 &lt;code&gt;VLESS + TCP(RAW) + REALITY&lt;/code&gt; 节点。这个方案不依赖自己的域名和证书，配置简单，隐蔽性和安全性也比传统裸露 TLS/WS 方案更适合新手自用。后续即使有了域名，也可以继续使用 REALITY，不一定非要改成 TLS 或 WebSocket。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;启用：开启&lt;/li&gt;
&lt;li&gt;备注：自定义一个好记的名称，例如 &lt;code&gt;美国-洛杉矶-1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;协议：选择 &lt;code&gt;VLESS&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;监听 IP：不填即可，表示监听所有地址&lt;/li&gt;
&lt;li&gt;端口：填写一个未被占用的端口，例如 &lt;code&gt;41507&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;总流量：填 &lt;code&gt;0&lt;/code&gt; 表示不限制流量&lt;/li&gt;
&lt;li&gt;到期时间：不填表示不限制到期时间&lt;/li&gt;
&lt;li&gt;传输：一般选择 &lt;code&gt;TCP (RAW)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;安全：选择 &lt;code&gt;REALITY&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;uTLS：选择 &lt;code&gt;chrome&lt;/code&gt; 或 &lt;code&gt;firefox&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;目标 / Target / Dest：填写一个稳定的 HTTPS 站点，例如 &lt;code&gt;www.microsoft.com:443&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;SNI / Server Names：填写同一个域名，例如 &lt;code&gt;www.microsoft.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;SpiderX：保持 &lt;code&gt;/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Short IDs：使用面板默认值，或点击生成按钮重新生成&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;REALITY 区域里如果看到 &lt;strong&gt;Get New Cert&lt;/strong&gt;、&lt;strong&gt;Get New Seed&lt;/strong&gt; 这类按钮，直接点击生成新的密钥和种子；不要复用网上教程里的公钥、私钥或 Short ID。&lt;/p&gt;
&lt;p&gt;客户端区域保留自动生成的用户即可，也可以把 Email 改成自己能识别的名字，例如 &lt;code&gt;my-phone&lt;/code&gt;。如果 VLESS 客户端设置里有 Flow 选项，优先选择 &lt;code&gt;xtls-rprx-vision&lt;/code&gt;；如果当前面板或传输方式没有这个选项，保持默认就行。&lt;/p&gt;
&lt;p&gt;有些新版 3X-UI 会把“入站”和“客户端”分开管理。如果你需要单独新增客户端，可以进入左侧 &lt;strong&gt;客户端&lt;/strong&gt;，点击 &lt;strong&gt;添加客户端&lt;/strong&gt;，填写一个便于识别的 Email 或备注，再在 &lt;strong&gt;关联入站&lt;/strong&gt; 里选择刚创建的 VLESS + REALITY 入站，最后点击 &lt;strong&gt;创建&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./13-xui-client-config.png&quot; alt=&quot;图13：在 3X-UI 客户端页面新增客户端，并关联到刚创建的 REALITY 入站&quot; /&gt;&lt;/p&gt;
&lt;p&gt;确认配置后点击 &lt;strong&gt;添加&lt;/strong&gt; 或 &lt;strong&gt;Create&lt;/strong&gt;。添加完成后，检查入站状态是否启用，并确认 &lt;code&gt;xray state&lt;/code&gt; 是 Running。&lt;/p&gt;
&lt;p&gt;如果服务器开启了 &lt;code&gt;ufw&lt;/code&gt;，还需要放行刚才设置的节点端口：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ufw allow 41507/tcp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;端口要换成你实际填写的入站端口。只放行面板端口是不够的，节点端口也必须能从外部访问。&lt;/p&gt;
&lt;p&gt;添加完成后，回到入站列表，点击该入站左侧的展开按钮，再点击信息图标或二维码图标即可查看节点详情和连接 URL。复制 URL 后，可以导入到客户端使用。&lt;/p&gt;
&lt;p&gt;常见客户端：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;iOS：Shadowrocket&lt;/li&gt;
&lt;li&gt;Android：v2rayNG、Hiddify 或支持 VLESS REALITY 的客户端&lt;/li&gt;
&lt;li&gt;电脑端：v2rayN、Nekoray、Hiddify 等&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;手机端也可以点击二维码图标，用客户端扫码导入。&lt;/p&gt;
&lt;h2&gt;有域名时的 TLS 方案&lt;/h2&gt;
&lt;p&gt;如果你有自己的域名，也可以把域名解析到服务器 IP 后走 TLS 方案。不过对新手来说，前面推荐的 &lt;code&gt;VLESS + REALITY&lt;/code&gt; 通常已经够用，而且不需要处理证书申请、续期和域名解析，这部分只作为备用方案。&lt;/p&gt;
&lt;p&gt;整体流程是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在域名 DNS 管理后台添加 &lt;code&gt;A&lt;/code&gt; 记录，指向搬瓦工 VPS 的 IP&lt;/li&gt;
&lt;li&gt;等待 DNS 生效&lt;/li&gt;
&lt;li&gt;在 3X-UI 管理脚本中申请 HTTPS 证书&lt;/li&gt;
&lt;li&gt;回到入站配置，将安全选项切换为 &lt;strong&gt;TLS&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;证书位置选择 &lt;strong&gt;从面板设置证书&lt;/strong&gt; 自动填充&lt;/li&gt;
&lt;li&gt;保存入站配置&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;官方 wiki 已经把证书管理集中到 &lt;code&gt;x-ui&lt;/code&gt; 管理脚本中。服务器终端执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;x-ui
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后选择 &lt;strong&gt;SSL Certificate Management&lt;/strong&gt;，按提示申请域名证书、续期证书或设置面板证书路径。证书申请前要确保域名已经解析到当前服务器 IP，并且服务器的 &lt;code&gt;80&lt;/code&gt; 端口没有被其他服务占用。&lt;/p&gt;
&lt;p&gt;如果域名托管在 Cloudflare，也可以在管理菜单里选择 &lt;strong&gt;Cloudflare SSL Certificate&lt;/strong&gt;，按提示填入 Cloudflare API Token 申请证书。细节以 3X-UI 官方 wiki 为准：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/MHSanaei/3x-ui/wiki&quot;&gt;https://github.com/MHSanaei/3x-ui/wiki&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在 3X-UI 添加入站时，选择 &lt;strong&gt;TLS&lt;/strong&gt; 后，可以点击 &lt;strong&gt;从面板设置证书&lt;/strong&gt; 自动填充证书路径。确认 SNI、证书路径和密钥路径无误后，点击添加或保存。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./11-xui-tls-cert.png&quot; alt=&quot;图11：有域名和证书时，在 3X-UI 入站配置中选择 TLS 并从面板设置证书&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;复制节点并导入客户端&lt;/h2&gt;
&lt;p&gt;节点创建完成后，进入 &lt;strong&gt;入站列表&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;点击入站左侧的展开按钮&lt;/li&gt;
&lt;li&gt;点击信息图标查看详情&lt;/li&gt;
&lt;li&gt;在 URL 区域复制节点链接&lt;/li&gt;
&lt;li&gt;打开客户端，选择从剪贴板导入&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;./12-xui-copy-node.png&quot; alt=&quot;图12：展开入站详情后复制节点 URL，或用二维码扫码导入&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如果是手机端，可以点击二维码图标，然后用 Shadowrocket、Clash Verge 或其他支持对应协议的客户端扫码导入。&lt;/p&gt;
&lt;p&gt;导入后建议先测试连通性。如果连不上，按下面顺序排查：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;入站端口是否和客户端配置一致&lt;/li&gt;
&lt;li&gt;服务器安全组或防火墙是否放行入站端口&lt;/li&gt;
&lt;li&gt;协议、UUID、传输方式是否一致&lt;/li&gt;
&lt;li&gt;开启 TLS 时域名是否解析正确&lt;/li&gt;
&lt;li&gt;证书路径和密钥路径是否正确&lt;/li&gt;
&lt;li&gt;使用 REALITY 时，客户端是否支持 &lt;code&gt;VLESS + REALITY&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;REALITY 的目标域名、SNI、公钥、Short ID 和客户端链接是否一致&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;安全建议&lt;/h2&gt;
&lt;p&gt;面板搭好后，建议立刻做几件事：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用强密码，不要使用默认账号密码&lt;/li&gt;
&lt;li&gt;面板端口尽量使用随机高位端口&lt;/li&gt;
&lt;li&gt;保留安装时生成的随机面板路径，不要改成过于简单的路径&lt;/li&gt;
&lt;li&gt;不要把面板地址公开发到群聊或论坛&lt;/li&gt;
&lt;li&gt;定期更新系统和 3X-UI&lt;/li&gt;
&lt;li&gt;不再需要密码登录时，可以改用 SSH key&lt;/li&gt;
&lt;li&gt;重要配置做好备份，避免重装系统后丢失&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果只是自用，最简单稳定的路径是：搬瓦工或 DMIT VPS + Ubuntu 22.04 + Termius SSH + 3X-UI 面板。搬瓦工可以先用 root 密码登录，DMIT 主要用 SSH key 登录；入站协议优先选 &lt;code&gt;VLESS + TCP(RAW) + REALITY&lt;/code&gt;。先把这个节点跑通，再考虑域名、证书和其他传输方案，这样遇到问题时更容易定位。&lt;/p&gt;
</content:encoded></item><item><title>Qmai Playbook 索引：AI 执行手册清单</title><link>https://blog.961121.xyz/posts/playbook-index/</link><guid isPermaLink="true">https://blog.961121.xyz/posts/playbook-index/</guid><description>Playbook 是 AI 真正执行任务时读取的场景手册；索引只负责说明有哪些手册。</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Playbook 是 AI 执行任务时使用的场景手册。&lt;/p&gt;
&lt;p&gt;它不替代宏观规则，也不替代仓库职责清单。正确顺序是：先判断需求和仓库，再选择最小 playbook。&lt;/p&gt;
&lt;h2&gt;使用前先读&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;/posts/global-constraints/&quot;&gt;全局约束&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/project-detection/&quot;&gt;项目识别&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/workflow-router/&quot;&gt;工作流路由&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Playbook 清单&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Playbook&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;code&gt;需求解析.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;需求、飞书、工单或接口文档还没有明确目标仓库时，先分析系统和仓库归属&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;国际交付工作流.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;一个需求需要从分析、方案、实现、验证一直走到交付说明&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Vue业务子应用.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;普通 &lt;code&gt;*-vue-international&lt;/code&gt; 业务页面、组件、路由、API、i18n、样式改动&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;基座与跨应用.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;qiankun 基座、登录、菜单、头部、容器、微应用挂载、跨应用状态&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;公共业务与打印模板.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;公共业务页、公共配置、打印模板、票据模板，以及 &lt;code&gt;operation&lt;/code&gt; 打印项目边界判断&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;共享组件库.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;vue-kylin-international&lt;/code&gt; 共享组件、组件样式、组件 API、跨仓一致性问题&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;样式设计规范.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;UI、UX、页面布局、后台视觉、设计 token、长文本和 RTL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;装修平台.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;装修平台主工程和 &lt;code&gt;design-v0-international&lt;/code&gt; 组件库相关任务&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;预发布流程.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;明确进入发布阶段后的普通国际仓 &lt;code&gt;pre&lt;/code&gt; 发布、发布状态检查和 OPMS 排障&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;为什么不把路由写在索引里&lt;/h2&gt;
&lt;p&gt;索引只负责“有哪些手册”。&lt;/p&gt;
&lt;p&gt;完整路由逻辑统一放在工作流路由中，避免同一套规则在多个文档里重复维护，最后出现分叉。&lt;/p&gt;
&lt;h2&gt;使用示例&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;需求描述&lt;/th&gt;
&lt;th&gt;应该怎么走&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;“飞书需求说要改会员权益，但没说仓库”&lt;/td&gt;
&lt;td&gt;先走 &lt;code&gt;需求解析.md&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;“商品列表页新增一个筛选项”&lt;/td&gt;
&lt;td&gt;明确归属后走 &lt;code&gt;Vue业务子应用.md&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;“菜单入口不显示”&lt;/td&gt;
&lt;td&gt;走 &lt;code&gt;基座与跨应用.md&lt;/code&gt;，必要时联查业务仓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;“多个仓库的门店选择器样式都不一致”&lt;/td&gt;
&lt;td&gt;走 &lt;code&gt;共享组件库.md&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;“打印纸面内容字段顺序要调整”&lt;/td&gt;
&lt;td&gt;先判断 common 模板还是 &lt;code&gt;operation&lt;/code&gt; 运行时，再走 &lt;code&gt;公共业务与打印模板.md&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;“部署预发布环境”&lt;/td&gt;
&lt;td&gt;这是可选发布阶段，走 &lt;code&gt;预发布流程.md&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;新增 playbook 的规则&lt;/h2&gt;
&lt;p&gt;新增 playbook 前，先确认现有手册无法覆盖。&lt;/p&gt;
&lt;p&gt;如果确实需要新增，要同步检查：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;工作流路由。&lt;/li&gt;
&lt;li&gt;Playbook 索引。&lt;/li&gt;
&lt;li&gt;维护映射。&lt;/li&gt;
&lt;li&gt;相关宏观文档是否已经先更新。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Playbook 的目标不是越多越好，而是让 AI 在正确边界内稳定执行。&lt;/p&gt;
</content:encoded></item><item><title>Qmai 项目识别：先判断项目角色，再选择规则</title><link>https://blog.961121.xyz/posts/project-detection/</link><guid isPermaLink="true">https://blog.961121.xyz/posts/project-detection/</guid><description>项目识别的核心是：先看当前项目证据，再判断系统角色，不靠本机路径和个人印象猜。</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;项目识别回答一个基础问题：当前工作区到底是不是 Qmai 国际前端项目？如果是，它属于哪类系统？&lt;/p&gt;
&lt;p&gt;只有先回答这个问题，后面的规则和 playbook 才有意义。&lt;/p&gt;
&lt;h2&gt;三步判断法&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;找到项目根目录
  -&amp;gt; 判断是否命中 Qmai 信号
  -&amp;gt; 判断系统角色和仓库职责
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;1. 找到当前项目根目录&lt;/h2&gt;
&lt;p&gt;AI 进入项目后，先从当前目录向上找最近的 &lt;code&gt;package.json&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;如果一个工作区里有多个项目，就根据用户提供的文件、路由、需求关键词，定位最相关的项目。&lt;/p&gt;
&lt;p&gt;如果无法确定项目根目录，需要说明缺少上下文，而不是继续猜。&lt;/p&gt;
&lt;h2&gt;2. 判断是否是 Qmai 项目&lt;/h2&gt;
&lt;p&gt;命中以下任意强信号，可以按 Qmai 项目处理：&lt;/p&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;code&gt;scripts&lt;/code&gt; 中出现 &lt;code&gt;qmai build&lt;/code&gt;、&lt;code&gt;qmai format&lt;/code&gt;、&lt;code&gt;qmai deploy&lt;/code&gt; 等命令&lt;/td&gt;
&lt;td&gt;构建链路属于 Qmai 体系&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;依赖中出现 &lt;code&gt;@qmai/*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;使用 Qmai 组件或工程能力&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;出现 &lt;code&gt;eslint-plugin-qmai&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;使用 Qmai 代码规范&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;依赖别名中出现 &lt;code&gt;npm:@qmai/*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;通过别名引入 Qmai 包&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;目录名或包名里出现 &lt;code&gt;qmai&lt;/code&gt;、&lt;code&gt;qimai&lt;/code&gt; 只能作为辅助信号，不能作为唯一依据。&lt;/p&gt;
&lt;p&gt;如果完全没有命中 Qmai 信号，就按当前项目自己的 README、配置和代码风格处理，不强行套用 Qmai 规则。&lt;/p&gt;
&lt;h2&gt;3. 判断系统角色&lt;/h2&gt;
&lt;p&gt;Qmai 国际前端里，不同系统角色有不同处理方式。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;系统角色&lt;/th&gt;
&lt;th&gt;常见信号&lt;/th&gt;
&lt;th&gt;典型职责&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;qiankun 基座&lt;/td&gt;
&lt;td&gt;依赖 &lt;code&gt;qiankun&lt;/code&gt;，涉及登录、菜单、头部、容器、微应用注册&lt;/td&gt;
&lt;td&gt;&lt;code&gt;console-vue-international&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;普通业务子应用&lt;/td&gt;
&lt;td&gt;Vue2、业务路由、业务页面、子应用生命周期&lt;/td&gt;
&lt;td&gt;多数 &lt;code&gt;*-vue-international&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;公共业务页&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/commonCenter/&lt;/code&gt;、公共配置、打印模板&lt;/td&gt;
&lt;td&gt;&lt;code&gt;common-vue-international&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;共享组件库&lt;/td&gt;
&lt;td&gt;包名或源码指向 &lt;code&gt;vue-kylin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;vue-kylin-international&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;打印项目&lt;/td&gt;
&lt;td&gt;打印插件、桥接、国际打印代码、打印通用入口&lt;/td&gt;
&lt;td&gt;&lt;code&gt;operation&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;装修平台&lt;/td&gt;
&lt;td&gt;Vue3 装修主工程或装修组件库&lt;/td&gt;
&lt;td&gt;&lt;code&gt;design-vue-3-international&lt;/code&gt;、&lt;code&gt;design-v0-international&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;&lt;code&gt;*-vue-international&lt;/code&gt; 必须查职责清单&lt;/h2&gt;
&lt;p&gt;当目标可能是某个 &lt;code&gt;*-vue-international&lt;/code&gt; 仓库时，不能只靠仓库名猜。&lt;/p&gt;
&lt;p&gt;必须先查“国际 Vue 仓库职责清单”，它会说明：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每个仓库的一句话职责。&lt;/li&gt;
&lt;li&gt;哪些需求优先改这个仓库。&lt;/li&gt;
&lt;li&gt;关键模块和路由线索。&lt;/li&gt;
&lt;li&gt;容易混淆的边界。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例如：&lt;/p&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;code&gt;console-vue-international&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;公共配置、公共打印模板、硬件、KDS 公共配置&lt;/td&gt;
&lt;td&gt;&lt;code&gt;common-vue-international&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;商品、SKU、分类、配方、商品库存&lt;/td&gt;
&lt;td&gt;&lt;code&gt;goods-vue-international&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;餐饮订单、外卖、堂食、排队、桌台、KDS&lt;/td&gt;
&lt;td&gt;&lt;code&gt;catering-vue-international&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;会员、积分、等级、会员画像&lt;/td&gt;
&lt;td&gt;&lt;code&gt;member-vue-international&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;传统 BI 报表&lt;/td&gt;
&lt;td&gt;&lt;code&gt;bi-vue-international&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;自助 BI、数据集、数据源、工作空间&lt;/td&gt;
&lt;td&gt;&lt;code&gt;qmbi-vue-international&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;完整职责不要在项目识别页重复维护，应回到仓库职责清单。&lt;/p&gt;
&lt;h2&gt;Vite 不是优先判断依据&lt;/h2&gt;
&lt;p&gt;如果仓库里还存在 &lt;code&gt;vite.config.*&lt;/code&gt;，通常按历史遗留或兼容配置读取。&lt;/p&gt;
&lt;p&gt;国际前端当前开发和验证优先看仓库自己的 &lt;code&gt;package.json&lt;/code&gt; scripts，通常是 rsbuild 或 qmai 构建链路。&lt;/p&gt;
&lt;h2&gt;输出结果应该包含什么&lt;/h2&gt;
&lt;p&gt;AI 完成项目识别后，应能说清楚：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;当前项目是否命中 Qmai 信号。&lt;/li&gt;
&lt;li&gt;当前项目更像哪类系统角色。&lt;/li&gt;
&lt;li&gt;目标仓库判断的证据是什么。&lt;/li&gt;
&lt;li&gt;是否需要联查基座、组件库、公共页或打印项目。&lt;/li&gt;
&lt;li&gt;当前工作区缺少哪些跨仓上下文。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;项目识别不是为了“多读文件”，而是为了让后续修改落在正确边界内。&lt;/p&gt;
</content:encoded></item><item><title>Qmai 国际前端规则模式：让 AI 先懂业务边界，再写代码</title><link>https://blog.961121.xyz/posts/qmai-agent-center-introduction/</link><guid isPermaLink="true">https://blog.961121.xyz/posts/qmai-agent-center-introduction/</guid><description>这篇文章用通俗方式介绍 Qmai 国际前端规则中心：为什么要做规则分层、每层解决什么问题，以及一个真实需求如何从业务判断进入 AI 执行。</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;它是什么&lt;/h2&gt;
&lt;p&gt;Qmai 国际前端规则中心不是一个业务系统，也不是一份普通提示词。&lt;/p&gt;
&lt;p&gt;它是一套前端协作规则模式：把“需求应该落到哪里”“不同仓库负责什么”“AI 修改代码前要遵守什么”这些团队经验，整理成清晰、可读取、可执行的规则。&lt;/p&gt;
&lt;p&gt;简单说，它让 AI 在写代码前先完成三件事：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;看懂需求属于哪个业务系统。&lt;/li&gt;
&lt;li&gt;找到应该修改的前端仓库。&lt;/li&gt;
&lt;li&gt;按团队约束完成实现、验证和交付。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;为什么需要它&lt;/h2&gt;
&lt;p&gt;Qmai 国际前端不是一个单仓库项目，而是一组系统共同工作：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;console-vue-international&lt;/code&gt; 负责后台基座、菜单、登录、容器和微应用挂载。&lt;/li&gt;
&lt;li&gt;多个 &lt;code&gt;*-vue-international&lt;/code&gt; 仓库负责不同业务域页面。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;common-vue-international&lt;/code&gt; 负责公共业务页和公共打印模板。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vue-kylin-international&lt;/code&gt; 负责共享业务组件。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;operation&lt;/code&gt; 负责打印运行时、打印桥接和国际打印代码。&lt;/li&gt;
&lt;li&gt;装修平台、BI、供应链、营销、会员、支付等又有各自边界。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果没有统一规则，AI 或新人很容易遇到这些问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;只看需求关键词就猜仓库。&lt;/li&gt;
&lt;li&gt;把共享组件问题复制修到多个业务仓库。&lt;/li&gt;
&lt;li&gt;把打印模板和打印运行时代码混在一起。&lt;/li&gt;
&lt;li&gt;UI 页面只按通用模板做，忽略 Qmai 后台真实工作台风格。&lt;/li&gt;
&lt;li&gt;进入发布阶段后误用 feature 分支、正式环境或浏览器操作。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;规则中心解决的就是这些边界问题。&lt;/p&gt;
&lt;h2&gt;新版规则怎么分层&lt;/h2&gt;
&lt;p&gt;新版规则中心用“人先看地图，AI 再执行细则”的方式组织。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;层级&lt;/th&gt;
&lt;th&gt;作用&lt;/th&gt;
&lt;th&gt;可以怎么理解&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;00-总览&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;解释国际前端整体由什么构成&lt;/td&gt;
&lt;td&gt;一张系统全景图&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;01-PRD到系统拆分&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;把需求、飞书、工单拆到系统和仓库&lt;/td&gt;
&lt;td&gt;需求归属判断表&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;02-系统内部结构&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;说明每类系统内部怎么拆模块和文件&lt;/td&gt;
&lt;td&gt;仓库内部导航&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;03-模块页面命名&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;统一页面、路由、API、i18n、样式命名&lt;/td&gt;
&lt;td&gt;落代码的命名规则&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;04-样式与组件库&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;说明样式入口、主题变量、组件库和 UI 规范&lt;/td&gt;
&lt;td&gt;页面和组件怎么长&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;05-AI执行规则&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;给 AI 的全局约束、项目识别、路由和 playbook&lt;/td&gt;
&lt;td&gt;AI 真正执行时读这里&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;06-维护映射&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;说明宏观规则变更后要同步哪些执行规则&lt;/td&gt;
&lt;td&gt;规则更新检查表&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这套分层的好处是：人读起来像文档，AI 执行起来像流程。&lt;/p&gt;
&lt;h2&gt;一个需求如何被处理&lt;/h2&gt;
&lt;p&gt;可以把一次交付想成一条固定链路：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;收到需求
  -&amp;gt; 读取需求内容
  -&amp;gt; 提取业务词、页面词、接口词
  -&amp;gt; 查仓库职责清单
  -&amp;gt; 判断目标系统和目标仓库
  -&amp;gt; 判断是否涉及基座、组件库、公共页、打印或 UI
  -&amp;gt; 选择最小 playbook
  -&amp;gt; 修改前给出目标、影响范围和步骤
  -&amp;gt; 实现、验证、交付说明
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里最关键的是前半段。代码不是第一步，判断边界才是第一步。&lt;/p&gt;
&lt;h2&gt;最重要的规则&lt;/h2&gt;
&lt;h3&gt;1. 先判断仓库，不先写代码&lt;/h3&gt;
&lt;p&gt;普通 &lt;code&gt;*-vue-international&lt;/code&gt; 需求必须先查“国际 Vue 仓库职责清单”。这个清单会说明每个仓库的一句话职责、优先处理的需求、关键模块线索和容易混淆的边界。&lt;/p&gt;
&lt;h3&gt;2. UI 任务先读 UI 详细规范&lt;/h3&gt;
&lt;p&gt;只要涉及页面布局、组件视觉、样式、长文本或 RTL，就必须先读 UI 详细规范。Qmai 国际后台是高频业务工作台，不是营销官网，也不是通用 SaaS 卡片模板。&lt;/p&gt;
&lt;h3&gt;3. 打印要分清两个世界&lt;/h3&gt;
&lt;p&gt;公共打印模板和纸面内容布局优先看 &lt;code&gt;common-vue-international&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;打印插件、桥接、国际打印代码和运行时调试属于 &lt;code&gt;operation&lt;/code&gt;。&lt;/p&gt;
&lt;h3&gt;4. 可选发布阶段有独立约束&lt;/h3&gt;
&lt;p&gt;发布不属于默认交付主流程。只有任务明确进入发布或部署阶段时，才应用发布规则。&lt;/p&gt;
&lt;p&gt;普通国际仓发布到 OPMS 平台时，必须走本地配置和 &lt;code&gt;opms_release.py&lt;/code&gt; 脚本，不能通过浏览器页面点击完成。&lt;/p&gt;
&lt;p&gt;如果发布 &lt;code&gt;pre&lt;/code&gt;，必须先把当前任务分支合到 &lt;code&gt;pre&lt;/code&gt;，推送 &lt;code&gt;origin/pre&lt;/code&gt;，然后只部署 &lt;code&gt;branch/pre&lt;/code&gt;。不能直接部署 feature 分支。&lt;/p&gt;
&lt;h3&gt;5. AI 不主动做高风险动作&lt;/h3&gt;
&lt;p&gt;未经明确要求，不执行 &lt;code&gt;git commit&lt;/code&gt;、&lt;code&gt;git push&lt;/code&gt; 或发布。修改前先给方案，完成后说明改了什么、为什么、如何验证。&lt;/p&gt;
&lt;h2&gt;核心价值&lt;/h2&gt;
&lt;p&gt;Qmai 国际前端规则中心的价值体现在三个层面。&lt;/p&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;基座、业务仓、公共页、组件库、打印、装修平台和 UI 规范都有清晰职责&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI 层&lt;/td&gt;
&lt;td&gt;AI 在明确约束下执行，修改前有方案，修改后有验证和交付说明&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这套模式把多仓库协作经验沉淀为可读、可执行、可维护的规则，让 AI 编码从“直接生成代码”变成“先识别边界，再稳定交付”。&lt;/p&gt;
</content:encoded></item><item><title>Qmai 工作流路由：一个任务应该走哪条流程</title><link>https://blog.961121.xyz/posts/workflow-router/</link><guid isPermaLink="true">https://blog.961121.xyz/posts/workflow-router/</guid><description>工作流路由的作用是让 AI 不靠临场猜测，而是根据任务类型进入正确执行手册。</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;工作流路由回答一个问题：当前任务应该进入哪份执行手册？&lt;/p&gt;
&lt;p&gt;路由不是越复杂越好。它的目标是让 AI 选择“最小但足够”的 playbook，避免一个小页面问题被当成完整交付流程，也避免跨仓问题被当成单文件修改。&lt;/p&gt;
&lt;h2&gt;路由前先做两件事&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;按 &lt;a href=&quot;/posts/project-detection/&quot;&gt;项目识别&lt;/a&gt; 判断当前项目角色。&lt;/li&gt;
&lt;li&gt;如果需求可能落在 &lt;code&gt;*-vue-international&lt;/code&gt;，先查仓库职责清单。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;没有完成这两步，不应该直接进入代码修改。&lt;/p&gt;
&lt;h2&gt;路由原则&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;先按业务需求判断系统，再按当前项目证据判断仓库。&lt;/li&gt;
&lt;li&gt;选择最小匹配 playbook。&lt;/li&gt;
&lt;li&gt;不要求所有仓库位于同一个父目录。&lt;/li&gt;
&lt;li&gt;不维护个人本机路径映射。&lt;/li&gt;
&lt;li&gt;当前工作区不可见的跨仓上下文，只说明缺失，不猜路径。&lt;/li&gt;
&lt;li&gt;路由逻辑只维护在新版执行规则中，playbook 索引只做清单。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;任务路由表&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;任务类型&lt;/th&gt;
&lt;th&gt;进入的 playbook&lt;/th&gt;
&lt;th&gt;怎么理解&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;飞书链接、需求文案、目标仓库不明确&lt;/td&gt;
&lt;td&gt;&lt;code&gt;需求解析.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;先把需求翻译成系统和仓库判断&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;从需求分析到实现、验证、交付的完整链路&lt;/td&gt;
&lt;td&gt;&lt;code&gt;国际交付工作流.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;适合完整需求交付&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;普通 Vue2 业务子应用页面、组件、路由、API 改动&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Vue业务子应用.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;适合明确落在业务仓库的改动&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;登录、菜单、头部、容器、微应用挂载、跨应用状态&lt;/td&gt;
&lt;td&gt;&lt;code&gt;基座与跨应用.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;适合 qiankun 基座和跨应用问题&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;公共业务页、公共配置、打印模板、票据模板&lt;/td&gt;
&lt;td&gt;&lt;code&gt;公共业务与打印模板.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;适合 common 仓和模板内容&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;打印插件、桥接、国际打印代码、打印通用入口&lt;/td&gt;
&lt;td&gt;&lt;code&gt;公共业务与打印模板.md&lt;/code&gt;，并按 &lt;code&gt;operation&lt;/code&gt; 打印项目边界处理&lt;/td&gt;
&lt;td&gt;打印运行时不是普通业务仓流程&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;共享 UI 组件、组件行为、跨仓样式一致性&lt;/td&gt;
&lt;td&gt;&lt;code&gt;共享组件库.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;适合 &lt;code&gt;vue-kylin-international&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UI、UX、页面布局、设计 token、后台视觉规范&lt;/td&gt;
&lt;td&gt;&lt;code&gt;样式设计规范.md&lt;/code&gt;，并先读 UI 详细规范&lt;/td&gt;
&lt;td&gt;适合页面和组件视觉任务&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;装修平台主工程或装修组件库&lt;/td&gt;
&lt;td&gt;&lt;code&gt;装修平台.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;适合装修相关需求&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;明确要求普通国际仓 &lt;code&gt;pre&lt;/code&gt; 发布、状态检查、OPMS 排障&lt;/td&gt;
&lt;td&gt;&lt;code&gt;预发布流程.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;可选发布阶段，必须走配置文件和脚本&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;路由后的输出要求&lt;/h2&gt;
&lt;p&gt;AI 进入 playbook 前，应该先说明：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;目标系统。&lt;/li&gt;
&lt;li&gt;目标仓库。&lt;/li&gt;
&lt;li&gt;判断置信度。&lt;/li&gt;
&lt;li&gt;判断证据。&lt;/li&gt;
&lt;li&gt;是否需要联查基座、组件库、公共业务页或打印项目。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例如，一个“商品选择器在多个业务仓都展示异常”的问题，不能只进入当前业务仓页面修样式。它很可能需要进入 &lt;code&gt;共享组件库.md&lt;/code&gt;，检查 &lt;code&gt;vue-kylin-international&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;常见误区&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;误区&lt;/th&gt;
&lt;th&gt;正确做法&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;看到 &lt;code&gt;*-vue-international&lt;/code&gt; 就直接改当前仓库&lt;/td&gt;
&lt;td&gt;先查仓库职责清单&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;看到打印就直接归到一个仓库&lt;/td&gt;
&lt;td&gt;先区分 common 模板和 &lt;code&gt;operation&lt;/code&gt; 运行时&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UI 任务只看当前页面&lt;/td&gt;
&lt;td&gt;先读 UI 详细规范，再判断组件库或业务页归属&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;明确发布 &lt;code&gt;pre&lt;/code&gt; 时直接部署 feature 分支&lt;/td&gt;
&lt;td&gt;先合到 &lt;code&gt;pre&lt;/code&gt;，推送 &lt;code&gt;origin/pre&lt;/code&gt;，再部署 &lt;code&gt;branch/pre&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;规则中心接入时打开浏览器&lt;/td&gt;
&lt;td&gt;接入只做本地文件和配置，不用浏览器&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;工作流路由的价值，是把“这个任务应该怎么开始”标准化。&lt;/p&gt;
</content:encoded></item><item><title>Qmai 全局约束：AI 做事前先守住这些底线</title><link>https://blog.961121.xyz/posts/global-constraints/</link><guid isPermaLink="true">https://blog.961121.xyz/posts/global-constraints/</guid><description>AI 在 Qmai 国际前端项目中执行任务前，必须先遵守这些基础规则。</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;全局约束是 AI 执行任务前必须遵守的底线。&lt;/p&gt;
&lt;p&gt;它不解决“具体需求怎么写代码”，而是先规定什么能做、什么不能做、什么时候要先说明、什么时候必须停下来确认。&lt;/p&gt;
&lt;h2&gt;1. 修改前先说清楚&lt;/h2&gt;
&lt;p&gt;除非用户明确要求直接修改，否则 AI 修改前必须先给出简要方案：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;修改目标是什么。&lt;/li&gt;
&lt;li&gt;影响范围有哪些。&lt;/li&gt;
&lt;li&gt;准备怎么改。&lt;/li&gt;
&lt;li&gt;如何验证。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果涉及多个文件或多个模块，还要先列出预计影响文件。&lt;/p&gt;
&lt;p&gt;这条规则的目的不是拖慢执行，而是避免 AI 在没有边界判断时直接动手。&lt;/p&gt;
&lt;h2&gt;2. 先读上下文，再改代码&lt;/h2&gt;
&lt;p&gt;AI 不能只凭需求关键词猜仓库或路径。&lt;/p&gt;
&lt;p&gt;开始前至少要确认：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;当前项目根目录在哪里。&lt;/li&gt;
&lt;li&gt;当前项目是否属于 Qmai 国际前端体系。&lt;/li&gt;
&lt;li&gt;当前文件属于哪个系统、模块和业务边界。&lt;/li&gt;
&lt;li&gt;是否需要联查基座、组件库、公共业务页或打印项目。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果当前工作区看不到相关仓库，只能说明缺少上下文，不能猜本机路径。&lt;/p&gt;
&lt;h2&gt;3. 跨仓影响要先分析&lt;/h2&gt;
&lt;p&gt;这些场景不能只看当前页面：&lt;/p&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;code&gt;console-vue-international&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;多仓库共享组件、选择器、表格、上传、弹窗、组件样式&lt;/td&gt;
&lt;td&gt;&lt;code&gt;vue-kylin-international&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;公共业务页、公共配置、打印模板、票据模板&lt;/td&gt;
&lt;td&gt;&lt;code&gt;common-vue-international&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;打印插件、桥接、国际打印代码、打印通用入口&lt;/td&gt;
&lt;td&gt;&lt;code&gt;operation&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;4. 代码改动保持最小&lt;/h2&gt;
&lt;p&gt;AI 实现时遵守：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;保持当前文件和模块已有风格。&lt;/li&gt;
&lt;li&gt;不主动引入新依赖、新范式或新目录结构。&lt;/li&gt;
&lt;li&gt;不做无关重构。&lt;/li&gt;
&lt;li&gt;不删除错误处理、异常捕获或兼容逻辑。&lt;/li&gt;
&lt;li&gt;不把临时需求名写进长期变量名。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一个需求只做一个可验证闭环，不把历史治理混进来。&lt;/p&gt;
&lt;h2&gt;5. 接口规则&lt;/h2&gt;
&lt;p&gt;如果接口文档路径包含 &lt;code&gt;/sellers&lt;/code&gt;，默认按 &lt;code&gt;/assistant&lt;/code&gt; 进行接口定位、联调和代码映射，除非用户明确要求保持原样。&lt;/p&gt;
&lt;p&gt;涉及 &lt;code&gt;sellerId&lt;/code&gt; 的接口入参、路由参数或函数透传参数时，默认不需要前端主动传递。后端会从登录态中解析。&lt;/p&gt;
&lt;p&gt;历史代码已有 &lt;code&gt;sellerId&lt;/code&gt; 时，不顺手治理；只有当前需求明确要求、联调确认或它已经导致问题时再处理。&lt;/p&gt;
&lt;h2&gt;6. UI、i18n 和 RTL&lt;/h2&gt;
&lt;p&gt;只要任务涉及 UI、UX、页面布局、组件视觉、后台视觉规范、长文本或 RTL，就必须先读 UI 详细设计规范。&lt;/p&gt;
&lt;p&gt;实现时还要遵守：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可见文案走项目既有 i18n 方案。&lt;/li&gt;
&lt;li&gt;不把中文、英文或临时文案硬编码进模板。&lt;/li&gt;
&lt;li&gt;样式考虑长文本和 RTL。&lt;/li&gt;
&lt;li&gt;共享组件问题优先评估组件库，不在多个业务仓库复制补丁。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;7. 飞书内容先读取，再判断&lt;/h2&gt;
&lt;p&gt;用户提供飞书链接时，AI 的第一步是读取内容，再判断目标系统和仓库。&lt;/p&gt;
&lt;p&gt;业务任务中的读取链路是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;MCP -&amp;gt; lark-cli -&amp;gt; 浏览器兜底
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;只有三条链路都失败、权限不足或内容不可读时，才说明阻塞原因。&lt;/p&gt;
&lt;p&gt;注意：规则中心安装或接入不属于业务内容读取，不使用浏览器或 Chrome。&lt;/p&gt;
&lt;h2&gt;8. Git 和发布不能越界&lt;/h2&gt;
&lt;p&gt;未经用户明确要求，AI 不执行：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git commit&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git push&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布或部署&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;国际需求开发默认从目标仓最新 &lt;code&gt;pre&lt;/code&gt; 切出 &lt;code&gt;feature/*&lt;/code&gt; 分支，不能直接在 &lt;code&gt;pre&lt;/code&gt; 上改需求代码。&lt;/p&gt;
&lt;p&gt;发布不属于默认主流程。只有任务明确进入发布或部署阶段时，才应用发布规则。&lt;/p&gt;
&lt;p&gt;普通国际仓发布到 OPMS 平台必须走本地配置文件和 &lt;code&gt;opms_release.py&lt;/code&gt; 脚本，不使用浏览器或 Chrome 控制发布平台。&lt;/p&gt;
&lt;p&gt;部署 &lt;code&gt;pre&lt;/code&gt; 的固定顺序是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;当前任务分支
  -&amp;gt; merge 到 pre
  -&amp;gt; push origin/pre
  -&amp;gt; OPMS 部署 branch/pre
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;不能直接部署 feature 分支，也不能把 master、main、tag 作为普通国际仓 &lt;code&gt;pre&lt;/code&gt; 环境发布 ref。&lt;/p&gt;
&lt;h2&gt;9. 最小自查&lt;/h2&gt;
&lt;p&gt;AI 每次交付前至少自查：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;是否明确目标系统和目标仓库？&lt;/li&gt;
&lt;li&gt;是否读了必要的职责清单或 UI 规范？&lt;/li&gt;
&lt;li&gt;是否只改了当前需求相关文件？&lt;/li&gt;
&lt;li&gt;是否说明了验证方式？&lt;/li&gt;
&lt;li&gt;是否没有擅自提交、推送或发布？&lt;/li&gt;
&lt;li&gt;是否把不确定处标成“需确认”？&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>Qmai 维护映射：规则变更后怎么同步</title><link>https://blog.961121.xyz/posts/maintenance-map/</link><guid isPermaLink="true">https://blog.961121.xyz/posts/maintenance-map/</guid><description>维护映射让规则中心不再散乱：先改人能读懂的宏观文档，再同步 AI 执行规则。</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;维护映射回答一个问题：规则变了以后，应该同步哪些文档？&lt;/p&gt;
&lt;p&gt;新版规则中心不鼓励直接改 AI 执行细则。更稳的方式是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;先改宏观文档
  -&amp;gt; 查维护映射
  -&amp;gt; 同步 AI 执行规则
  -&amp;gt; 检查入口、链接和重复事实源
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;为什么需要维护映射&lt;/h2&gt;
&lt;p&gt;如果所有规则都写在 AI 执行文件里，会出现两个问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;人不好读，只知道 AI 应该怎么做，不知道业务边界为什么这样定。&lt;/li&gt;
&lt;li&gt;规则容易重复，多个入口各写一套，后续更新时很容易分叉。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;维护映射把规则分成两类：&lt;/p&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;人和 AI 都能读懂的业务语义源&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI 执行规则&lt;/td&gt;
&lt;td&gt;AI 真正执行任务时读取的约束、路由和 playbook&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;新版维护原则&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;00-04&lt;/code&gt; 是业务语义源。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;05-AI执行规则&lt;/code&gt; 是 AI 执行投影。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;06-维护映射&lt;/code&gt; 是同步协议。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;也就是说，业务边界、仓库职责、UI 规范、命名规则这些内容，应优先维护在宏观文档里。&lt;/p&gt;
&lt;p&gt;AI 执行规则只负责把这些内容投影成可执行动作。&lt;/p&gt;
&lt;h2&gt;常见同步场景&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;你修改了什么&lt;/th&gt;
&lt;th&gt;需要同步检查什么&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;系统全景、仓库角色、系统边界&lt;/td&gt;
&lt;td&gt;项目识别、工作流路由、playbook 索引&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PRD 归属、需求类型、接口规则&lt;/td&gt;
&lt;td&gt;需求解析、国际交付工作流、全局约束&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;国际 Vue 仓库职责清单&lt;/td&gt;
&lt;td&gt;需求解析、项目识别、工作流路由&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;基座、业务子应用、公共页、打印、装修平台结构&lt;/td&gt;
&lt;td&gt;对应 playbook 和工作流路由&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;页面、路由、API、i18n、样式命名&lt;/td&gt;
&lt;td&gt;Vue 业务子应用、国际交付工作流、全局约束&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UI 规范、主题变量、组件库依赖&lt;/td&gt;
&lt;td&gt;样式设计规范、共享组件库、基座与跨应用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;打印模板和打印运行时边界&lt;/td&gt;
&lt;td&gt;公共业务与打印模板、项目识别、全局约束&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;一次规则变更怎么做&lt;/h2&gt;
&lt;p&gt;例如，团队新增一个业务仓库职责：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;先更新仓库职责清单，让人能看懂这个仓库负责什么。&lt;/li&gt;
&lt;li&gt;再检查项目识别是否能识别这个仓库。&lt;/li&gt;
&lt;li&gt;再检查工作流路由是否需要新增或调整分流。&lt;/li&gt;
&lt;li&gt;再检查 playbook 索引是否需要补充说明。&lt;/li&gt;
&lt;li&gt;最后检查博客入口和旧规则残留。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;AI 同步输出模板&lt;/h2&gt;
&lt;p&gt;规则变更后，AI 应该用这种格式说明：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;已修改宏观文档：
已同步微观规则：
未同步但已检查：
可能影响：
自检结果：
需确认：
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;一句话总结&lt;/h2&gt;
&lt;p&gt;维护映射让规则中心保持一个事实源：人先维护业务地图，AI 再同步执行细则。&lt;/p&gt;
</content:encoded></item><item><title>Qmai 国际交付工作流：从需求到验证的 7 步</title><link>https://blog.961121.xyz/posts/international-delivery-workflow/</link><guid isPermaLink="true">https://blog.961121.xyz/posts/international-delivery-workflow/</guid><description>完整交付工作流展示 AI 如何在 Qmai 国际前端项目中稳定完成需求，而不是直接生成代码。</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;国际交付工作流用于处理完整需求。&lt;/p&gt;
&lt;p&gt;它不是单个页面的写法说明，而是一条从需求读取到最终交付的固定链路。&lt;/p&gt;
&lt;h2&gt;适用场景&lt;/h2&gt;
&lt;p&gt;适合使用完整交付工作流的场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用户给了飞书需求、工单或一段较完整的需求说明。&lt;/li&gt;
&lt;li&gt;需要分析目标系统和目标仓库。&lt;/li&gt;
&lt;li&gt;需求可能涉及多个仓库、共享组件、公共业务页、打印或基座。&lt;/li&gt;
&lt;li&gt;需要完成方案、实现、验证和交付说明。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果只是一个明确的单点修改，应该优先选择更小的 playbook。&lt;/p&gt;
&lt;h2&gt;7 步流程&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;1. 读取需求
2. 判断系统和仓库
3. 判断跨仓影响
4. 制定修改方案
5. 实现最小闭环
6. 验证
7. 输出交付说明
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;1. 读取需求&lt;/h2&gt;
&lt;p&gt;如果用户提供飞书链接，先读取内容，再判断目标系统。&lt;/p&gt;
&lt;p&gt;如果用户只给文字需求，就提取：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;业务目标。&lt;/li&gt;
&lt;li&gt;用户动作。&lt;/li&gt;
&lt;li&gt;页面或路由关键词。&lt;/li&gt;
&lt;li&gt;接口路径。&lt;/li&gt;
&lt;li&gt;状态、角色、异常路径。&lt;/li&gt;
&lt;li&gt;是否涉及 UI、i18n、RTL、打印，以及是否明确进入发布阶段。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这一步的产物不是代码，而是需求要落到哪里。&lt;/p&gt;
&lt;h2&gt;2. 判断系统和仓库&lt;/h2&gt;
&lt;p&gt;先按系统地图判断大类：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基座。&lt;/li&gt;
&lt;li&gt;业务子应用。&lt;/li&gt;
&lt;li&gt;公共业务页。&lt;/li&gt;
&lt;li&gt;共享组件库。&lt;/li&gt;
&lt;li&gt;打印运行时。&lt;/li&gt;
&lt;li&gt;装修平台。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果目标可能是 &lt;code&gt;*-vue-international&lt;/code&gt;，必须查仓库职责清单。&lt;/p&gt;
&lt;p&gt;判断结果应包含：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;目标系统。&lt;/li&gt;
&lt;li&gt;目标仓库。&lt;/li&gt;
&lt;li&gt;置信度。&lt;/li&gt;
&lt;li&gt;证据。&lt;/li&gt;
&lt;li&gt;需确认事项。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;3. 判断跨仓影响&lt;/h2&gt;
&lt;p&gt;这些情况要特别注意：&lt;/p&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;code&gt;console-vue-international&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;多仓共享组件、表格、选择器、上传、弹窗&lt;/td&gt;
&lt;td&gt;&lt;code&gt;vue-kylin-international&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;公共业务页、公共配置、打印模板&lt;/td&gt;
&lt;td&gt;&lt;code&gt;common-vue-international&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;打印插件、桥接、国际打印代码&lt;/td&gt;
&lt;td&gt;&lt;code&gt;operation&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UI、长文本、RTL、组件视觉&lt;/td&gt;
&lt;td&gt;UI 详细设计规范&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;当前工作区不可见的仓库，不能猜路径，只能说明缺少上下文。&lt;/p&gt;
&lt;h2&gt;4. 制定修改方案&lt;/h2&gt;
&lt;p&gt;动手前先说明：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;修改目标。&lt;/li&gt;
&lt;li&gt;影响范围。&lt;/li&gt;
&lt;li&gt;涉及文件。&lt;/li&gt;
&lt;li&gt;实现步骤。&lt;/li&gt;
&lt;li&gt;验证方式。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;多文件或多模块改动必须列出文件清单。&lt;/p&gt;
&lt;h2&gt;5. 实现最小闭环&lt;/h2&gt;
&lt;p&gt;实现时遵守全局约束：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不做无关重构。&lt;/li&gt;
&lt;li&gt;不引入新依赖。&lt;/li&gt;
&lt;li&gt;不删除兼容逻辑。&lt;/li&gt;
&lt;li&gt;可见文案走 i18n。&lt;/li&gt;
&lt;li&gt;样式兼顾长文本和 RTL。&lt;/li&gt;
&lt;li&gt;接口路径含 &lt;code&gt;/sellers&lt;/code&gt; 时默认按 &lt;code&gt;/assistant&lt;/code&gt; 映射。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sellerId&lt;/code&gt; 默认不由前端重复传递。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一个阶段只做一个可验证闭环，不留下半成品路径。&lt;/p&gt;
&lt;h2&gt;6. 验证&lt;/h2&gt;
&lt;p&gt;按改动范围选择验证方式：&lt;/p&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;检查 Markdown 链接、入口引用和旧规则残留&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;样式或 UI&lt;/td&gt;
&lt;td&gt;浏览器或截图检查默认、空、加载、错误、长文本&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;i18n&lt;/td&gt;
&lt;td&gt;检查翻译 key 和至少一种非中文语言&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RTL 敏感布局&lt;/td&gt;
&lt;td&gt;构造 RTL 或逻辑方向样式验证&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;code&gt;package.json&lt;/code&gt; scripts 构建或本地验证&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;可选发布流程&lt;/td&gt;
&lt;td&gt;仅在明确要求发布时，检查分支、配置文件、脚本和 OPMS ref&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;验证不是附加动作，而是交付的一部分。&lt;/p&gt;
&lt;h2&gt;7. 输出交付说明&lt;/h2&gt;
&lt;p&gt;完成后用中文说明：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;改了什么。&lt;/li&gt;
&lt;li&gt;为什么这么改。&lt;/li&gt;
&lt;li&gt;如何验证。&lt;/li&gt;
&lt;li&gt;还有哪些需确认事项。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;未经用户明确要求，不执行 &lt;code&gt;git commit&lt;/code&gt;、&lt;code&gt;git push&lt;/code&gt; 或发布。&lt;/p&gt;
&lt;h2&gt;可选发布阶段提醒&lt;/h2&gt;
&lt;p&gt;国际需求开发默认从目标仓最新 &lt;code&gt;pre&lt;/code&gt; 切出 &lt;code&gt;feature/*&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;禁止直接在 &lt;code&gt;pre&lt;/code&gt; 上改需求代码。&lt;/p&gt;
&lt;p&gt;发布不是默认交付主流程。只有任务明确进入发布或部署阶段时，才应用下面的规则。&lt;/p&gt;
&lt;p&gt;普通国际仓发布到 OPMS 平台时：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;任务分支 -&amp;gt; merge 到 pre -&amp;gt; push origin/pre -&amp;gt; 部署 branch/pre
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;不能直接部署 feature 分支，不能触发 gray、staging、pro、prod、tag、master 或 main 发布。&lt;/p&gt;
&lt;h2&gt;一句话总结&lt;/h2&gt;
&lt;p&gt;完整交付工作流不是让 AI “快点写”，而是让 AI 先判断边界、再最小修改、最后验证交付。&lt;/p&gt;
</content:encoded></item><item><title>Qmai 国际前端系统地图与仓库职责</title><link>https://blog.961121.xyz/posts/project-onboarding/</link><guid isPermaLink="true">https://blog.961121.xyz/posts/project-onboarding/</guid><description>这是理解 Qmai 国际前端规则中心最重要的一页：先看系统地图，再看仓库职责，最后再进入代码。</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;这一页回答一个最容易出错的问题：一个需求到底应该改哪个前端仓库？&lt;/p&gt;
&lt;p&gt;Qmai 国际前端不是单个项目，而是一组系统协作。需求来了以后，不能只靠关键词猜仓库，要先看系统地图和职责边界。&lt;/p&gt;
&lt;h2&gt;先看整体地图&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;Qmai 国际前端
  ├─ qiankun 基座
  │   └─ console-vue-international
  ├─ 业务子应用
  │   └─ 多个 *-vue-international 仓库
  ├─ 公共业务页和公共打印模板
  │   └─ common-vue-international
  ├─ 共享组件库
  │   └─ vue-kylin-international
  ├─ 打印运行时
  │   └─ operation
  ├─ 装修平台
  │   ├─ design-vue-3-international
  │   └─ design-v0-international
  └─ 可选发布流程
      └─ OPMS pre 发布脚本与配置
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;判断顺序&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;先读需求原文，不先猜仓库。&lt;/li&gt;
&lt;li&gt;提取业务词、页面词、接口词、路由词。&lt;/li&gt;
&lt;li&gt;先判断系统类型：基座、业务子应用、公共页、组件库、打印、装修平台。&lt;/li&gt;
&lt;li&gt;如果目标可能是 &lt;code&gt;*-vue-international&lt;/code&gt;，查完整仓库职责清单。&lt;/li&gt;
&lt;li&gt;判断是否需要联查基座、组件库、公共业务页或打印项目。&lt;/li&gt;
&lt;li&gt;再进入对应 playbook。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;系统角色表&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;系统角色&lt;/th&gt;
&lt;th&gt;仓库或项目&lt;/th&gt;
&lt;th&gt;主要职责&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;qiankun 基座&lt;/td&gt;
&lt;td&gt;&lt;code&gt;console-vue-international&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;登录、菜单、头部、侧栏、容器、微应用注册、跨应用状态、全局主题&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;公共业务页&lt;/td&gt;
&lt;td&gt;&lt;code&gt;common-vue-international&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/commonCenter/&lt;/code&gt;、公共能力页、公共配置、公共打印模板、票据模板&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;共享组件库&lt;/td&gt;
&lt;td&gt;&lt;code&gt;vue-kylin-international&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;选择器、表格、上传、业务弹窗、跨仓共享组件和组件包发布&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;打印运行时&lt;/td&gt;
&lt;td&gt;&lt;code&gt;operation&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;打印插件、桥接、国际打印代码、打印通用入口、本地调试&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;装修平台主工程&lt;/td&gt;
&lt;td&gt;&lt;code&gt;design-vue-3-international&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;点餐小程序、SOK、KDS、智慧屏、叫号屏等装修能力&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;装修组件库&lt;/td&gt;
&lt;td&gt;&lt;code&gt;design-v0-international&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;装修平台复用组件能力&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;&lt;code&gt;*-vue-international&lt;/code&gt; 仓库职责清单&lt;/h2&gt;
&lt;p&gt;下面是业务子应用仓库的简化职责表。真实任务中仍要结合当前仓库源码、路由和页面确认。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;仓库&lt;/th&gt;
&lt;th&gt;一句话职责&lt;/th&gt;
&lt;th&gt;典型需求关键词&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;console-vue-international&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;国际后台 qiankun 基座和壳层&lt;/td&gt;
&lt;td&gt;登录、菜单、头部、侧栏、主页、账号中心、微应用挂载&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;common-vue-international&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;公共业务能力页、公共打印模板和多业务复用页面&lt;/td&gt;
&lt;td&gt;公共配置、收款、配送中心、硬件、KDS、桌台、打印模板、消息中心&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;org-vue-international&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;组织、企业、账号、员工、门店、权限和品牌基础资料&lt;/td&gt;
&lt;td&gt;企业信息、品牌、组织架构、角色权限、员工、账号、门店、语言&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;goods-vue-international&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;商品中心、菜单商品、分类、门店商品、库存和配方资料&lt;/td&gt;
&lt;td&gt;商品、SKU、套餐、商品分组、分类、门店商品、库存、配方、税率&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;catering-vue-international&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;餐饮业务订单、门店经营设置、堂食、外卖、排队、桌台&lt;/td&gt;
&lt;td&gt;餐饮订单、售后、外卖、买单、取餐、预约、排队、KDS、桌台&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;std-vue-international&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;标准商城订单和售后轻量项目&lt;/td&gt;
&lt;td&gt;商城订单、商城售后、商城设置&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;coupon-vue-international&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;优惠券、卡券、券活动、券核销和第三方券&lt;/td&gt;
&lt;td&gt;券模板、券规则、卡券、实体卡、第三方券、团购券、券分析&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;marketing-vue-international&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;营销活动中心、广告、促销玩法和营销配置&lt;/td&gt;
&lt;td&gt;满减、促销、广告、会员价、推广员、帖子、营销管控&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cmk-vue-international&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CMK 营销画布、营销流程和活动编排&lt;/td&gt;
&lt;td&gt;营销画布、营销工作流、流程统计、活动编排、专属分享&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;member-vue-international&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;会员中心、会员资料、等级积分、会员营销和第三方会员渠道&lt;/td&gt;
&lt;td&gt;会员列表、标签、画像、RFM、积分、等级、付费会员、精准营销&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;payment-vue-international&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;支付、商户、台账、终端、钱包和会员资产&lt;/td&gt;
&lt;td&gt;支付配置、商户、交易订单、终端、台账、钱包、会员资产&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;message-vue-international&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;消息中心、消息渠道、订阅消息和消息推送&lt;/td&gt;
&lt;td&gt;短信、微信渠道、消息推送、推送记录、订阅消息&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;connector-vue-international&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;连接器事件中心和审批运营平台&lt;/td&gt;
&lt;td&gt;事件中心、事件详情、审批管理、创建审批&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;operating-vue-international&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;运营平台、应用中心、业务中心、帮助中心和平台能力&lt;/td&gt;
&lt;td&gt;应用市场、业务中心、连接器、数据标准、帮助中心、工单、SDK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;scm-vue-international&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;供应链、采购、仓储、配送、生产、分拣和库存流转&lt;/td&gt;
&lt;td&gt;供应商、仓库、采购、调拨、入库、出库、配送、生产、分拣&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bi-vue-international&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;传统 BI、经营报表、数据分析、大屏和指标看板&lt;/td&gt;
&lt;td&gt;数据中心、经营报表、商品分析、会员分析、热力图、财务报表&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;qmbi-vue-international&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;新版自助 BI、报表设计、数据集、数据源和工作空间&lt;/td&gt;
&lt;td&gt;分析设计器、报表、数据立方体、数据源、数据集、工作空间&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;常见混淆边界&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;容易混淆&lt;/th&gt;
&lt;th&gt;判断方式&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bi-vue-international&lt;/code&gt; 和 &lt;code&gt;qmbi-vue-international&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;传统经营报表看 &lt;code&gt;bi&lt;/code&gt;；自助 BI、报表设计器、数据集、工作空间看 &lt;code&gt;qmbi&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;marketing-vue-international&lt;/code&gt; 和 &lt;code&gt;cmk-vue-international&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;常规活动、广告、促销看 &lt;code&gt;marketing&lt;/code&gt;；营销画布和工作流看 &lt;code&gt;cmk&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;catering-vue-international&lt;/code&gt; 和 &lt;code&gt;std-vue-international&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;餐饮完整订单链路看 &lt;code&gt;catering&lt;/code&gt;；标准商城订单和售后轻量项目看 &lt;code&gt;std&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;connector-vue-international&lt;/code&gt; 和 &lt;code&gt;operating-vue-international&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;事件中心和审批看 &lt;code&gt;connector&lt;/code&gt;；平台运营、应用、业务中心看 &lt;code&gt;operating&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;common-vue-international&lt;/code&gt; 和业务子应用&lt;/td&gt;
&lt;td&gt;多业务复用、公共配置、公共模板看 &lt;code&gt;common&lt;/code&gt;；单业务页面看对应业务仓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;打印模板和打印运行时&lt;/td&gt;
&lt;td&gt;模板和纸面内容看 &lt;code&gt;common&lt;/code&gt;；插件、桥接、运行时代码看 &lt;code&gt;operation&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;样式和组件归属&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;问题&lt;/th&gt;
&lt;th&gt;优先归属&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;菜单、头部、壳层、容器、全局主题&lt;/td&gt;
&lt;td&gt;&lt;code&gt;console-vue-international&lt;/code&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;code&gt;vue-kylin-international&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;公共业务页或打印模板视觉&lt;/td&gt;
&lt;td&gt;&lt;code&gt;common-vue-international&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;打印插件、桥接、国际打印代码&lt;/td&gt;
&lt;td&gt;&lt;code&gt;operation&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;涉及 UI、UX、页面布局、组件视觉、长文本或 RTL 时，必须先读 &lt;a href=&quot;/posts/ui-design-spec/&quot;&gt;UI 详细设计规范&lt;/a&gt;。&lt;/p&gt;
&lt;h2&gt;给新人记住的口诀&lt;/h2&gt;
&lt;p&gt;先问系统，再问仓库；先看职责，再看代码。&lt;/p&gt;
&lt;p&gt;共享问题回组件库，壳层问题看基座，公共页看 common，打印运行时看 operation。&lt;/p&gt;
</content:encoded></item><item><title>Qmai 国际后台 UI 详细设计规范</title><link>https://blog.961121.xyz/posts/ui-design-spec/</link><guid isPermaLink="true">https://blog.961121.xyz/posts/ui-design-spec/</guid><description>Qmai 国际后台是高频业务工作台，UI 规范的目标是保持结构清晰、主次明确、组件复用、国际化友好。</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;UI 详细设计规范用于 Qmai 国际后台页面和组件。&lt;/p&gt;
&lt;p&gt;它的重点不是“让页面更花”，而是让后台业务界面更清晰、更稳定、更适合国际化。&lt;/p&gt;
&lt;h2&gt;什么时候必须读&lt;/h2&gt;
&lt;p&gt;只要任务涉及下面任意内容，就要先读 UI 规范：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;新增或改造后台页面。&lt;/li&gt;
&lt;li&gt;页面布局、视觉层级、表格、筛选区、配置页。&lt;/li&gt;
&lt;li&gt;组件视觉、弹窗、选择器、工作台、画布页。&lt;/li&gt;
&lt;li&gt;长文本、多语言、RTL。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;console-vue-international&lt;/code&gt; 壳层和容器视觉。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;common-vue-international&lt;/code&gt; 公共页或打印模板视觉。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vue-kylin-international&lt;/code&gt; 共享组件视觉和交互。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;这套 UI 的定位&lt;/h2&gt;
&lt;p&gt;Qmai 国际后台是给连锁餐饮总部、区域运营、门店管理、实施、财务、营销和配置人员使用的高频工作台。&lt;/p&gt;
&lt;p&gt;它不是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;营销官网。&lt;/li&gt;
&lt;li&gt;数据大屏秀场。&lt;/li&gt;
&lt;li&gt;通用 SaaS 卡片模板。&lt;/li&gt;
&lt;li&gt;每个仓库各自发明风格的拼盘。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;它应该是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;专业。&lt;/li&gt;
&lt;li&gt;克制。&lt;/li&gt;
&lt;li&gt;清晰。&lt;/li&gt;
&lt;li&gt;高信任。&lt;/li&gt;
&lt;li&gt;可复用。&lt;/li&gt;
&lt;li&gt;国际化友好。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;五个核心原则&lt;/h2&gt;
&lt;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;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;页面类型&lt;/h2&gt;
&lt;p&gt;新增或改造页面时，先判断它属于哪种类型。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;页面类型&lt;/th&gt;
&lt;th&gt;适合场景&lt;/th&gt;
&lt;th&gt;设计重点&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;列表页&lt;/td&gt;
&lt;td&gt;订单、商品、会员、优惠券等列表&lt;/td&gt;
&lt;td&gt;表格是主角，筛选区清晰，主 CTA 不抢查询按钮&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;配置页&lt;/td&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;td&gt;顶部返回和保存明确，分区节奏统一&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;选择器&lt;/td&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;td&gt;画布是主角，配置器是辅助&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;数据总览页&lt;/td&gt;
&lt;td&gt;KPI、趋势、排行、异常关注&lt;/td&gt;
&lt;td&gt;数据帮助行动，不做装饰性大屏&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;如果无法归入这些类型，再考虑新增页面骨架。&lt;/p&gt;
&lt;h2&gt;组件规则&lt;/h2&gt;
&lt;h3&gt;按钮&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;同一区域只保留一个最高权重主按钮。&lt;/li&gt;
&lt;li&gt;删除、停用、解绑等危险操作不能用主绿色。&lt;/li&gt;
&lt;li&gt;按钮文案走 i18n，不依赖中文短文案固定宽度。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;表单&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;label、输入区、提示和错误状态要清晰。&lt;/li&gt;
&lt;li&gt;长文本和多语言场景不能固定死宽。&lt;/li&gt;
&lt;li&gt;必填、校验、保存中、禁用状态必须完整。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;表格&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;列表页优先保留主身份字段。&lt;/li&gt;
&lt;li&gt;状态使用浅底胶囊或清晰文本，不只靠颜色表达。&lt;/li&gt;
&lt;li&gt;行内操作超过 3 个时考虑收进更多菜单。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;弹窗和抽屉&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;轻确认用弹窗。&lt;/li&gt;
&lt;li&gt;复杂编辑用全屏页或专门编辑器。&lt;/li&gt;
&lt;li&gt;高风险弹窗必须写清影响范围和后果。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;卡片和容器&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;普通业务内容使用白底、轻边框、少阴影。&lt;/li&gt;
&lt;li&gt;不把列表页做成卡片墙。&lt;/li&gt;
&lt;li&gt;不在卡片里再嵌套卡片。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;原型还原和组件边界&lt;/h2&gt;
&lt;p&gt;产品原型已经给出明确结构时，优先还原业务页内部体验。&lt;/p&gt;
&lt;p&gt;但要注意：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不复制示例工程的壳层、侧栏、导航或调试水印。&lt;/li&gt;
&lt;li&gt;不为了复用 Element UI 而牺牲关键业务结构。&lt;/li&gt;
&lt;li&gt;已有成熟能力，例如商品选择、门店选择、渠道选择，应先搜索项目和 &lt;code&gt;vue-kylin-international&lt;/code&gt; 是否已有组件。&lt;/li&gt;
&lt;li&gt;接口没有字段承载的说明性提示，不应做成可保存、可切换的配置控件。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;技术归属&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;UI 问题&lt;/th&gt;
&lt;th&gt;优先处理位置&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;菜单、头部、侧栏、容器、主题注入&lt;/td&gt;
&lt;td&gt;&lt;code&gt;console-vue-international&lt;/code&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;code&gt;vue-kylin-international&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;公共业务页、打印模板、票据预览&lt;/td&gt;
&lt;td&gt;&lt;code&gt;common-vue-international&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;打印插件、桥接、国际打印运行时代码&lt;/td&gt;
&lt;td&gt;&lt;code&gt;operation&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;共享组件问题不要在多个业务仓库复制补丁。&lt;/p&gt;
&lt;h2&gt;i18n、RTL 和可访问性&lt;/h2&gt;
&lt;p&gt;UI 改动必须考虑国际化：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;所有新增可见文案进入仓库既有 i18n 流程。&lt;/li&gt;
&lt;li&gt;不把中文、英文或临时文案硬编码进模板。&lt;/li&gt;
&lt;li&gt;长英文、泰文、阿语等文本要预留换行和宽度。&lt;/li&gt;
&lt;li&gt;尽量使用 &lt;code&gt;gap&lt;/code&gt;、逻辑属性或自适应布局，避免只写 &lt;code&gt;margin-left&lt;/code&gt;、&lt;code&gt;padding-left&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;颜色不能成为唯一状态表达，必须有文字或图标辅助。&lt;/li&gt;
&lt;li&gt;focus、loading、disabled、empty、error 状态要完整。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;样式落地规则&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;局部样式优先写在当前组件 scoped 样式里。&lt;/li&gt;
&lt;li&gt;微前端全局样式必须加项目级前缀，避免污染其他子应用。&lt;/li&gt;
&lt;li&gt;不为单个需求新增全局样式文件，除非已有模块模式要求。&lt;/li&gt;
&lt;li&gt;优先复用仓库已有 CSS 变量和组件库 token。&lt;/li&gt;
&lt;li&gt;不引入新的 UI 依赖或图标体系。&lt;/li&gt;
&lt;li&gt;不用大面积浅彩背景、彩色阴影、过大圆角制造高级感。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;设计系统预览模板&lt;/h2&gt;
&lt;p&gt;新版规则中心新增了可运行的 Vue2 预览模板，位置在：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;04-样式与组件库/设计系统预览模板/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;它的作用是把抽象 UI 规则翻译成一张可以对照的后台页面。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;看布局：侧栏、页面头、内容区和工作台区域怎么分层。&lt;/li&gt;
&lt;li&gt;看组件：按钮、状态、表单、表格、空状态、确认弹窗怎么保持一致。&lt;/li&gt;
&lt;li&gt;看边界：页面局部样式、共享组件、打印/票据预览分别应该落到哪里。&lt;/li&gt;
&lt;li&gt;看国际化：文案只是预览 fallback，进入业务代码时必须换成目标仓库 i18n key。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;模板页面预览&lt;/h3&gt;
&lt;p&gt;下面是文档内的静态预览。完整运行版以新版规则中心里的 Vue2 组件为准。&lt;/p&gt;
&lt;p&gt;&amp;lt;style&amp;gt;
.qmai-doc-preview {
--qmai-green: #1fc069;
--qmai-green-light: #e9f9f0;
--qmai-ink: #101828;
--qmai-text: #344054;
--qmai-muted: #667085;
--qmai-border: #eaecf0;
--qmai-soft: #f8fafb;
--qmai-blue: #2e90fa;
--qmai-blue-light: #eff8ff;
--qmai-warn: #f79009;
--qmai-warn-light: #fffaeb;
--qmai-danger: #d92d20;
--qmai-danger-light: #fef3f2;
display: flex;
margin: 24px 0;
overflow: hidden;
color: var(--qmai-text);
font-size: 13px;
line-height: 1.5;
background: linear-gradient(180deg, #edf4ff 0%, #ffffff 42%);
border: 1px solid var(--qmai-border);
border-radius: 8px;
box-shadow: 0 10px 24px rgba(16, 24, 40, 0.06);
}
.qmai-doc-preview * {
box-sizing: border-box;
}
.qmai-doc-preview__rail {
flex: 0 0 176px;
padding: 18px 14px;
background: rgba(255, 255, 255, 0.88);
border-right: 1px solid var(--qmai-border);
}
.qmai-doc-preview__brand {
display: flex;
gap: 10px;
align-items: center;
padding-bottom: 14px;
border-bottom: 1px solid var(--qmai-border);
}
.qmai-doc-preview__mark {
display: grid;
place-items: center;
width: 34px;
height: 34px;
color: #fff;
font-weight: 800;
background: var(--qmai-green);
border-radius: 8px;
}
.qmai-doc-preview__brand strong,
.qmai-doc-preview h3,
.qmai-doc-preview h4 {
color: var(--qmai-ink);
}
.qmai-doc-preview__brand span {
display: block;
margin-top: 2px;
color: var(--qmai-muted);
font-size: 11px;
font-weight: 700;
}
.qmai-doc-preview__nav {
display: grid;
gap: 6px;
margin-top: 14px;
}
.qmai-doc-preview__nav span {
min-height: 30px;
padding: 7px 10px;
color: var(--qmai-text);
font-weight: 700;
background: transparent;
border-radius: 8px;
}
.qmai-doc-preview__nav span:first-child {
color: var(--qmai-green);
background: var(--qmai-green-light);
}
.qmai-doc-preview__main {
flex: 1;
min-width: 0;
padding: 20px;
}
.qmai-doc-preview__head {
display: flex;
gap: 16px;
align-items: flex-start;
justify-content: space-between;
margin-bottom: 18px;
}
.qmai-doc-preview h3 {
margin: 0;
font-size: 22px;
line-height: 1.2;
}
.qmai-doc-preview h4 {
margin: 0 0 10px;
font-size: 15px;
}
.qmai-doc-preview p {
margin: 6px 0 0;
color: var(--qmai-muted);
}
.qmai-doc-preview__actions,
.qmai-doc-preview__row,
.qmai-doc-preview__toolbar {
display: flex;
flex-wrap: wrap;
gap: 8px;
align-items: center;
}
.qmai-doc-preview__button {
min-height: 32px;
padding: 0 13px;
color: var(--qmai-text);
font-weight: 800;
background: #fff;
border: 1px solid #d0d5dd;
border-radius: 8px;
}
.qmai-doc-preview__button--primary {
color: #fff;
background: var(--qmai-green);
border-color: var(--qmai-green);
}
.qmai-doc-preview__button--danger {
color: var(--qmai-danger);
background: #fff;
border-color: #fecdca;
}
.qmai-doc-preview__section {
padding: 18px 0;
border-top: 1px solid rgba(234, 236, 240, 0.9);
}
.qmai-doc-preview__section-head {
display: flex;
gap: 16px;
align-items: flex-start;
justify-content: space-between;
margin-bottom: 12px;
}
.qmai-doc-preview__grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 10px;
}
.qmai-doc-preview__grid--two {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.qmai-doc-preview__card,
.qmai-doc-preview__swatch,
.qmai-doc-preview__workbench {
background: #fff;
border: 1px solid var(--qmai-border);
border-radius: 8px;
box-shadow: 0 1px 2px rgba(16, 24, 40, 0.03);
}
.qmai-doc-preview__card {
padding: 14px;
}
.qmai-doc-preview__index {
display: inline-flex;
align-items: center;
height: 24px;
padding: 0 9px;
color: var(--qmai-green);
font-size: 11px;
font-weight: 800;
background: var(--qmai-green-light);
border: 1px solid #b7e4c7;
border-radius: 999px;
}
.qmai-doc-preview__card strong {
display: block;
margin-top: 10px;
color: var(--qmai-ink);
}
.qmai-doc-preview__swatch {
display: flex;
gap: 10px;
align-items: center;
padding: 12px;
}
.qmai-doc-preview__color {
flex: 0 0 auto;
width: 36px;
height: 36px;
border: 1px solid rgba(16, 24, 40, 0.08);
border-radius: 8px;
}
.qmai-doc-preview__meta strong,
.qmai-doc-preview__meta span {
display: block;
}
.qmai-doc-preview__meta span {
color: #98a2b3;
font-size: 11px;
font-weight: 700;
}
.qmai-doc-preview__pill {
display: inline-flex;
align-items: center;
min-height: 24px;
padding: 0 10px;
font-size: 12px;
font-weight: 800;
border: 1px solid transparent;
border-radius: 999px;
}
.qmai-doc-preview__pill--success {
color: var(--qmai-green);
background: var(--qmai-green-light);
border-color: #b7e4c7;
}
.qmai-doc-preview__pill--info {
color: var(--qmai-blue);
background: var(--qmai-blue-light);
border-color: #b9e6fe;
}
.qmai-doc-preview__pill--warn {
color: var(--qmai-warn);
background: var(--qmai-warn-light);
border-color: #fedf89;
}
.qmai-doc-preview__pill--danger {
color: var(--qmai-danger);
background: var(--qmai-danger-light);
border-color: #fecdca;
}
.qmai-doc-preview__field {
display: grid;
grid-template-columns: 92px minmax(0, 1fr);
gap: 10px;
align-items: center;
margin-bottom: 10px;
}
.qmai-doc-preview__field label {
color: var(--qmai-text);
font-weight: 800;
}
.qmai-doc-preview__input,
.qmai-doc-preview__select,
.qmai-doc-preview__textarea {
width: 100%;
min-height: 34px;
padding: 7px 10px;
color: var(--qmai-text);
background: #fff;
border: 1px solid #d0d5dd;
border-radius: 8px;
}
.qmai-doc-preview__textarea {
min-height: 68px;
}
.qmai-doc-preview__toolbar {
margin-bottom: 10px;
}
.qmai-doc-preview__search {
flex: 1 1 220px;
min-height: 34px;
padding: 7px 10px;
color: #98a2b3;
background: #fff;
border: 1px solid #d0d5dd;
border-radius: 8px;
}
.qmai-doc-preview__table-wrap {
overflow-x: auto;
}
.qmai-doc-preview table {
width: 100%;
min-width: 620px;
border-collapse: collapse;
}
.qmai-doc-preview th,
.qmai-doc-preview td {
padding: 10px 12px;
text-align: left;
border: 1px solid var(--qmai-border);
}
.qmai-doc-preview th {
color: var(--qmai-text);
font-weight: 800;
background: var(--qmai-soft);
}
.qmai-doc-preview__empty {
display: grid;
place-items: center;
min-height: 160px;
padding: 20px;
text-align: center;
background: var(--qmai-soft);
border: 1px dashed #d0d5dd;
border-radius: 8px;
}
.qmai-doc-preview__empty-icon {
width: 48px;
height: 36px;
margin: 0 auto 10px;
background: linear-gradient(180deg, #fff 0%, #f5f7f8 100%);
border: 1px solid var(--qmai-border);
border-radius: 8px;
box-shadow: inset 0 -9px 0 rgba(234, 236, 240, 0.7);
}
.qmai-doc-preview__dialog {
padding: 14px;
background: var(--qmai-danger-light);
border: 1px solid #fecdca;
border-radius: 8px;
}
.qmai-doc-preview__workbench {
display: grid;
grid-template-columns: 120px minmax(220px, 1fr) 180px;
gap: 12px;
min-height: 280px;
padding: 12px;
background: var(--qmai-soft);
}
.qmai-doc-preview__tools {
display: grid;
align-content: start;
gap: 8px;
}
.qmai-doc-preview__tools span,
.qmai-doc-preview__inspector {
background: #fff;
border: 1px solid var(--qmai-border);
border-radius: 8px;
}
.qmai-doc-preview__tools span {
min-height: 32px;
padding: 7px 10px;
font-weight: 800;
}
.qmai-doc-preview__paper {
justify-self: center;
width: min(260px, 100%);
min-height: 250px;
padding: 22px 18px;
background: #fff;
border: 1px solid var(--qmai-border);
box-shadow: 0 14px 28px rgba(16, 24, 40, 0.08);
}
.qmai-doc-preview__line,
.qmai-doc-preview__total,
.qmai-doc-preview__paper-head {
background: var(--qmai-border);
border-radius: 999px;
}
.qmai-doc-preview__paper-head {
width: 96px;
height: 18px;
margin: 0 auto 22px;
}
.qmai-doc-preview__line {
width: 72%;
height: 9px;
margin-bottom: 10px;
}
.qmai-doc-preview__line--long {
width: 100%;
}
.qmai-doc-preview__total {
height: 38px;
margin-top: 28px;
background: var(--qmai-green-light);
border: 1px solid #b7e4c7;
}
.qmai-doc-preview__inspector {
padding: 12px;
}
.qmai-doc-preview__bar {
height: 8px;
margin-top: 10px;
background: linear-gradient(90deg, var(--qmai-green) 0 72%, var(--qmai-border) 72% 100%);
border-radius: 999px;
}
@media (max-width: 980px) {
.qmai-doc-preview {
display: block;
}
.qmai-doc-preview__rail {
border-right: 0;
border-bottom: 1px solid var(--qmai-border);
}
.qmai-doc-preview__nav,
.qmai-doc-preview__grid,
.qmai-doc-preview__grid--two,
.qmai-doc-preview__workbench {
grid-template-columns: 1fr;
}
.qmai-doc-preview__nav {
display: flex;
flex-wrap: wrap;
}
.qmai-doc-preview__head,
.qmai-doc-preview__section-head {
display: block;
}
.qmai-doc-preview__actions {
margin-top: 12px;
}
}
&amp;lt;/style&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;div class=&quot;qmai-doc-preview&quot;&amp;gt;
&amp;lt;aside class=&quot;qmai-doc-preview__rail&quot;&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__brand&quot;&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__mark&quot;&amp;gt;Q&amp;lt;/div&amp;gt;
&amp;lt;div&amp;gt;
&amp;lt;strong&amp;gt;Qmai International&amp;lt;/strong&amp;gt;
&amp;lt;span&amp;gt;Design System&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__nav&quot;&amp;gt;
&amp;lt;span&amp;gt;设计原则&amp;lt;/span&amp;gt;
&amp;lt;span&amp;gt;颜色与层级&amp;lt;/span&amp;gt;
&amp;lt;span&amp;gt;按钮与状态&amp;lt;/span&amp;gt;
&amp;lt;span&amp;gt;表单与表格&amp;lt;/span&amp;gt;
&amp;lt;span&amp;gt;反馈与弹窗&amp;lt;/span&amp;gt;
&amp;lt;span&amp;gt;工作台画布&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/aside&amp;gt;
&amp;lt;main class=&quot;qmai-doc-preview__main&quot;&amp;gt;
&amp;lt;section class=&quot;qmai-doc-preview__head&quot;&amp;gt;
&amp;lt;div&amp;gt;
&amp;lt;h3&amp;gt;组件库预览&amp;lt;/h3&amp;gt;
&amp;lt;p&amp;gt;用于统一国际后台的按钮、表单、表格、状态、弹窗和工作台类页面视觉基线。&amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__actions&quot;&amp;gt;
&amp;lt;span class=&quot;qmai-doc-preview__button&quot;&amp;gt;导出规范&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;qmai-doc-preview__button qmai-doc-preview__button--primary&quot;&amp;gt;应用模板&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/section&amp;gt;
&amp;lt;section class=&quot;qmai-doc-preview__section&quot;&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__section-head&quot;&amp;gt;
&amp;lt;h4&amp;gt;设计原则&amp;lt;/h4&amp;gt;
&amp;lt;p&amp;gt;先定结构，再做视觉；先判断归属，再落代码。&amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__grid&quot;&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__card&quot;&amp;gt;
&amp;lt;span class=&quot;qmai-doc-preview__index&quot;&amp;gt;01&amp;lt;/span&amp;gt;
&amp;lt;strong&amp;gt;Structure Before Decoration&amp;lt;/strong&amp;gt;
&amp;lt;p&amp;gt;先用结构、对齐、留白和信息顺序解决问题。&amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__card&quot;&amp;gt;
&amp;lt;span class=&quot;qmai-doc-preview__index&quot;&amp;gt;02&amp;lt;/span&amp;gt;
&amp;lt;strong&amp;gt;One Action Authority&amp;lt;/strong&amp;gt;
&amp;lt;p&amp;gt;一个局部区域只保留一个最高权重动作。&amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__card&quot;&amp;gt;
&amp;lt;span class=&quot;qmai-doc-preview__index&quot;&amp;gt;03&amp;lt;/span&amp;gt;
&amp;lt;strong&amp;gt;Shared Component First&amp;lt;/strong&amp;gt;
&amp;lt;p&amp;gt;重复组件问题优先回到共享组件库处理。&amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/section&amp;gt;
&amp;lt;section class=&quot;qmai-doc-preview__section&quot;&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__section-head&quot;&amp;gt;
&amp;lt;h4&amp;gt;颜色与层级&amp;lt;/h4&amp;gt;
&amp;lt;p&amp;gt;绿色承担动作，中性色承担大部分界面表达。&amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__grid&quot;&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__swatch&quot;&amp;gt;
&amp;lt;span class=&quot;qmai-doc-preview__color&quot; style=&quot;background:#1fc069&quot;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;qmai-doc-preview__meta&quot;&amp;gt;&amp;lt;strong&amp;gt;Color Primary&amp;lt;/strong&amp;gt;&amp;lt;span&amp;gt;主按钮 / 启用态&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__swatch&quot;&amp;gt;
&amp;lt;span class=&quot;qmai-doc-preview__color&quot; style=&quot;background:#e9f9f0&quot;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;qmai-doc-preview__meta&quot;&amp;gt;&amp;lt;strong&amp;gt;Primary Light&amp;lt;/strong&amp;gt;&amp;lt;span&amp;gt;选中浅底 / 状态浅底&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__swatch&quot;&amp;gt;
&amp;lt;span class=&quot;qmai-doc-preview__color&quot; style=&quot;background:#101828&quot;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;qmai-doc-preview__meta&quot;&amp;gt;&amp;lt;strong&amp;gt;Ink 900&amp;lt;/strong&amp;gt;&amp;lt;span&amp;gt;页面标题 / 强标题&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/section&amp;gt;
&amp;lt;section class=&quot;qmai-doc-preview__section&quot;&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__grid qmai-doc-preview__grid--two&quot;&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__card&quot;&amp;gt;
&amp;lt;h4&amp;gt;按钮&amp;lt;/h4&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__row&quot;&amp;gt;
&amp;lt;span class=&quot;qmai-doc-preview__button qmai-doc-preview__button--primary&quot;&amp;gt;保存&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;qmai-doc-preview__button&quot;&amp;gt;取消&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;qmai-doc-preview__button qmai-doc-preview__button--danger&quot;&amp;gt;删除&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;p&amp;gt;危险操作不用主绿色，保存中、禁用态、二次确认都要完整。&amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__card&quot;&amp;gt;
&amp;lt;h4&amp;gt;状态&amp;lt;/h4&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__row&quot;&amp;gt;
&amp;lt;span class=&quot;qmai-doc-preview__pill qmai-doc-preview__pill--success&quot;&amp;gt;已启用&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;qmai-doc-preview__pill qmai-doc-preview__pill--info&quot;&amp;gt;待同步&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;qmai-doc-preview__pill qmai-doc-preview__pill--warn&quot;&amp;gt;需确认&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;qmai-doc-preview__pill qmai-doc-preview__pill--danger&quot;&amp;gt;失败&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;p&amp;gt;状态必须有文字，不只依赖颜色表达。&amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/section&amp;gt;
&amp;lt;section class=&quot;qmai-doc-preview__section&quot;&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__grid qmai-doc-preview__grid--two&quot;&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__card&quot;&amp;gt;
&amp;lt;h4&amp;gt;表单&amp;lt;/h4&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__field&quot;&amp;gt;
&amp;lt;label&amp;gt;模板名称&amp;lt;/label&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__input&quot;&amp;gt;总部默认票据模板&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__field&quot;&amp;gt;
&amp;lt;label&amp;gt;适用范围&amp;lt;/label&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__select&quot;&amp;gt;全部门店&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__field&quot;&amp;gt;
&amp;lt;label&amp;gt;备注&amp;lt;/label&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__textarea&quot;&amp;gt;给运营人员看的短说明，长文本需要可换行。&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__card&quot;&amp;gt;
&amp;lt;h4&amp;gt;表格&amp;lt;/h4&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__toolbar&quot;&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__search&quot;&amp;gt;搜索名称、编码或门店&amp;lt;/div&amp;gt;
&amp;lt;span class=&quot;qmai-doc-preview__button qmai-doc-preview__button--primary&quot;&amp;gt;查询&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;qmai-doc-preview__button&quot;&amp;gt;重置&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__table-wrap&quot;&amp;gt;
&amp;lt;table&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;th&amp;gt;模板名称&amp;lt;/th&amp;gt;
&amp;lt;th&amp;gt;编码&amp;lt;/th&amp;gt;
&amp;lt;th&amp;gt;状态&amp;lt;/th&amp;gt;
&amp;lt;th&amp;gt;操作&amp;lt;/th&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td&amp;gt;总部默认票据模板&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;TPL-001&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;&amp;lt;span class=&quot;qmai-doc-preview__pill qmai-doc-preview__pill--success&quot;&amp;gt;已启用&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;编辑 · 复制&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td&amp;gt;外卖渠道小票模板&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;TPL-002&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;&amp;lt;span class=&quot;qmai-doc-preview__pill qmai-doc-preview__pill--info&quot;&amp;gt;待同步&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;编辑 · 复制&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/section&amp;gt;
&amp;lt;section class=&quot;qmai-doc-preview__section&quot;&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__grid qmai-doc-preview__grid--two&quot;&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__card&quot;&amp;gt;
&amp;lt;h4&amp;gt;空状态&amp;lt;/h4&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__empty&quot;&amp;gt;
&amp;lt;div&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__empty-icon&quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;strong&amp;gt;当前筛选条件下暂无数据&amp;lt;/strong&amp;gt;
&amp;lt;p&amp;gt;调整筛选条件，或新建一个模板后继续配置。&amp;lt;/p&amp;gt;
&amp;lt;span class=&quot;qmai-doc-preview__button qmai-doc-preview__button--primary&quot;&amp;gt;新建模板&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__card&quot;&amp;gt;
&amp;lt;h4&amp;gt;确认弹窗&amp;lt;/h4&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__dialog&quot;&amp;gt;
&amp;lt;strong&amp;gt;停用模板&amp;lt;/strong&amp;gt;
&amp;lt;p&amp;gt;停用后，关联门店将不再使用该模板。请确认已有替代模板。&amp;lt;/p&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__row&quot; style=&quot;margin-top:12px&quot;&amp;gt;
&amp;lt;span class=&quot;qmai-doc-preview__button&quot;&amp;gt;取消&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;qmai-doc-preview__button qmai-doc-preview__button--danger&quot;&amp;gt;确认停用&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/section&amp;gt;
&amp;lt;section class=&quot;qmai-doc-preview__section&quot;&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__section-head&quot;&amp;gt;
&amp;lt;h4&amp;gt;工作台 / 画布页&amp;lt;/h4&amp;gt;
&amp;lt;p&amp;gt;画布是主角，配置器是辅助；适合打印模板、票据预览、设计编辑器。&amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__workbench&quot;&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__tools&quot;&amp;gt;
&amp;lt;span&amp;gt;返回&amp;lt;/span&amp;gt;
&amp;lt;span&amp;gt;预览&amp;lt;/span&amp;gt;
&amp;lt;span&amp;gt;校验&amp;lt;/span&amp;gt;
&amp;lt;span&amp;gt;发布&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__paper&quot;&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__paper-head&quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__line qmai-doc-preview__line--long&quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__line&quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__line qmai-doc-preview__line--long&quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__line&quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__total&quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__inspector&quot;&amp;gt;
&amp;lt;h4&amp;gt;配置器&amp;lt;/h4&amp;gt;
&amp;lt;p&amp;gt;布局密度&amp;lt;/p&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__bar&quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;p&amp;gt;打印模块&amp;lt;/p&amp;gt;
&amp;lt;div class=&quot;qmai-doc-preview__select&quot;&amp;gt;订单信息&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/section&amp;gt;
&amp;lt;/main&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h3&gt;运行版入口&lt;/h3&gt;
&lt;p&gt;新版规则中心提供三种查看方式：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;方式&lt;/th&gt;
&lt;th&gt;适合场景&lt;/th&gt;
&lt;th&gt;入口&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;独立本地预览项目&lt;/td&gt;
&lt;td&gt;不依赖业务仓库，直接查看完整模板&lt;/td&gt;
&lt;td&gt;&lt;code&gt;standalone-preview-app/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;嵌入式预览入口&lt;/td&gt;
&lt;td&gt;复用 &lt;code&gt;common-vue-international&lt;/code&gt; 已安装依赖，不修改业务代码&lt;/td&gt;
&lt;td&gt;&lt;code&gt;embedded-preview/main.js&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vue2 单文件组件&lt;/td&gt;
&lt;td&gt;挂到目标仓库临时路由或作为评审对照页&lt;/td&gt;
&lt;td&gt;&lt;code&gt;components/QmaiInternationalDesignSystemPreview.vue&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;独立预览启动命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd &amp;lt;qmai-rule-root&amp;gt;/04-样式与组件库/设计系统预览模板/standalone-preview-app
pnpm install
pnpm dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;嵌入式预览启动命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd &amp;lt;common-vue-international-root&amp;gt;
./node_modules/.bin/vue-cli-service serve \
  &amp;lt;qmai-rule-root&amp;gt;/04-样式与组件库/设计系统预览模板/embedded-preview/main.js \
  --host 127.0.0.1 \
  --port 5177
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览模板不是生产业务页面。真正进入业务代码时，示例数据和 fallback 文案必须替换为目标仓库的真实数据与 i18n key；重复组件问题优先回到 &lt;code&gt;vue-kylin-international&lt;/code&gt;，不要在多个业务仓库复制补丁。&lt;/p&gt;
&lt;h2&gt;交付前检查&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;这页属于哪种页面类型？&lt;/li&gt;
&lt;li&gt;主工作面是否明确？&lt;/li&gt;
&lt;li&gt;页面标题是否可以减少一层？&lt;/li&gt;
&lt;li&gt;文案是否都走 i18n？&lt;/li&gt;
&lt;li&gt;是否出现多个同权重主按钮？&lt;/li&gt;
&lt;li&gt;是否把列表页做成卡片墙？&lt;/li&gt;
&lt;li&gt;是否把壳层装饰带进内容区？&lt;/li&gt;
&lt;li&gt;保存、返回、确认路径是否稳定？&lt;/li&gt;
&lt;li&gt;是否需要联查基座或组件库？&lt;/li&gt;
&lt;li&gt;RTL 和长文本是否会撑破布局？&lt;/li&gt;
&lt;li&gt;空、错、加载、禁用、保存中状态是否完整？&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;一句话总结&lt;/h2&gt;
&lt;p&gt;Qmai 国际后台 UI 不是追求装饰感，而是追求清楚、有秩序、可复用、能承载真实业务操作。&lt;/p&gt;
</content:encoded></item><item><title>中国大陆用户通过 Google Play 订阅 ChatGPT / Codex 会员教程</title><link>https://blog.961121.xyz/posts/china-mainland-chatgpt-codex-membership-google-play/</link><guid isPermaLink="true">https://blog.961121.xyz/posts/china-mainland-chatgpt-codex-membership-google-play/</guid><description>本文面向中国大陆用户，介绍通过 Google 账号绑定 Visa 卡，并在安卓手机或 BlueStacks 模拟器中使用 Google Play 订阅 ChatGPT / Codex 相关会员的完整流程。</description><pubDate>Mon, 25 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;大陆用户想给 ChatGPT / Codex 开会员，麻烦主要出在付款上。走 Google Play 订阅是一条相对省心的路：把一张支持海外线上支付的 Visa 卡绑到 Google 账号，然后在安卓环境里通过应用内订阅完成付款。后续的扣费、退款、取消订阅都由 Google Play 统一管理，不用再和别的支付渠道打交道。&lt;/p&gt;
&lt;p&gt;这条路门槛不高：一个 Google 账号，一张能海外线上支付的 Visa 卡，再加一台安卓手机——没有安卓手机也没关系，电脑上装个 BlueStacks 模拟器一样能走通。下面按实际操作顺序过一遍。&lt;/p&gt;
&lt;h2&gt;先把要用的东西备齐&lt;/h2&gt;
&lt;p&gt;具体来说，你需要：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一个可以正常登录的 Google 账号&lt;/li&gt;
&lt;li&gt;一张支持海外线上支付的 Visa 信用卡或借记卡&lt;/li&gt;
&lt;li&gt;一台安卓手机，或一台能装安卓模拟器的电脑&lt;/li&gt;
&lt;li&gt;一个可以正常登录的 ChatGPT 账号&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;都齐了就可以开始绑卡。&lt;/p&gt;
&lt;h2&gt;打开 Google 账号的付款页面&lt;/h2&gt;
&lt;p&gt;绑卡在网页端完成。浏览器打开 Google 账号的付款与订阅页面：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://myaccount.google.com/payments-and-subscriptions&quot;&gt;https://myaccount.google.com/payments-and-subscriptions&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;登录后进入 &lt;strong&gt;钱包和订阅&lt;/strong&gt; 页面，找到 &lt;strong&gt;付款方式&lt;/strong&gt; 区域，点击 &lt;strong&gt;管理付款方式&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./figure1.png&quot; alt=&quot;图1：Google 钱包和订阅页面&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;绑定 Visa 卡&lt;/h2&gt;
&lt;p&gt;在付款方式管理页面选择添加新的银行卡，填上 Visa 卡信息。几个容易踩坑的点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;持卡人姓名要和银行卡信息一致&lt;/li&gt;
&lt;li&gt;卡号、有效期、CVV 按银行卡实际信息填写&lt;/li&gt;
&lt;li&gt;账单地址可以从 &lt;a href=&quot;https://usaddressgen.com/tax-free-address/&quot;&gt;https://usaddressgen.com/tax-free-address/&lt;/a&gt; 复制一个美国免税州的随机地址，能免去税费&lt;/li&gt;
&lt;li&gt;支付失败的话，先检查银行卡有没有开境外线上支付权限&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;绑定成功后回到付款方式页面，确认这张卡已经保存在当前 Google 账号下。到这里网页端的事就做完了，接下来切到安卓环境。&lt;/p&gt;
&lt;h2&gt;安装 ChatGPT App&lt;/h2&gt;
&lt;p&gt;订阅要在 App 内完成，所以需要一个能跑 Google Play 的安卓环境，有没有安卓手机都行。&lt;/p&gt;
&lt;h3&gt;有安卓手机&lt;/h3&gt;
&lt;p&gt;直接打开 &lt;strong&gt;Google Play 商店&lt;/strong&gt;，搜索并安装 &lt;strong&gt;ChatGPT&lt;/strong&gt;。装之前确认一下应用名称是 ChatGPT、开发者是 OpenAI，别装错。&lt;/p&gt;
&lt;h3&gt;没有安卓手机：用 BlueStacks&lt;/h3&gt;
&lt;p&gt;在电脑上装 BlueStacks 安卓模拟器，下载地址：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bluestacks.com/&quot;&gt;https://www.bluestacks.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;装好后：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开 BlueStacks&lt;/li&gt;
&lt;li&gt;登录前面绑好 Visa 卡的那个 Google 账号&lt;/li&gt;
&lt;li&gt;打开 Google Play 商店&lt;/li&gt;
&lt;li&gt;搜索 &lt;code&gt;ChatGPT&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;安装 OpenAI 官方的 ChatGPT App&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;在 Google Play 下载 ChatGPT&lt;/h2&gt;
&lt;p&gt;不管用手机还是模拟器，最后都是在 Google Play 里搜 &lt;code&gt;ChatGPT&lt;/code&gt;，进入 OpenAI 官方应用页面。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./figure2.png&quot; alt=&quot;图2：Google Play 中的 ChatGPT 应用页面&quot; /&gt;&lt;/p&gt;
&lt;p&gt;页面显示 &lt;strong&gt;安装&lt;/strong&gt; 就直接点安装；显示 &lt;strong&gt;打开&lt;/strong&gt; 或 &lt;strong&gt;更新&lt;/strong&gt;，说明应用已经装过了，直接打开或先更新到最新版都行。&lt;/p&gt;
&lt;h2&gt;登录并订阅会员&lt;/h2&gt;
&lt;p&gt;App 装好就到最后一步了。打开 ChatGPT App：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;登录你的 ChatGPT 账号&lt;/li&gt;
&lt;li&gt;进入账号、设置或订阅页面&lt;/li&gt;
&lt;li&gt;选好要升级的会员方案&lt;/li&gt;
&lt;li&gt;核对 Google Play 弹出的订阅付款信息&lt;/li&gt;
&lt;li&gt;用前面绑定的 Visa 卡完成支付&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;支付成功后回到 App 里看一眼，确认会员状态已经生效。没生效的话，往下看常见问题。&lt;/p&gt;
&lt;h2&gt;常见问题&lt;/h2&gt;
&lt;h3&gt;Google 绑卡失败怎么办&lt;/h3&gt;
&lt;p&gt;优先检查这几项：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Visa 卡是否支持海外线上支付&lt;/li&gt;
&lt;li&gt;银行卡是否开了境外支付权限&lt;/li&gt;
&lt;li&gt;账单地址是否与付款方式信息一致&lt;/li&gt;
&lt;li&gt;Google 账号是否存在付款资料异常或风控限制&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Google Play 搜不到 ChatGPT 怎么办&lt;/h3&gt;
&lt;p&gt;多半和 Google Play 的账号地区、设备环境或网络环境有关。可以确认：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Google Play 是否已经正常登录&lt;/li&gt;
&lt;li&gt;当前网络是否稳定&lt;/li&gt;
&lt;li&gt;搜索结果里的开发者是不是 OpenAI&lt;/li&gt;
&lt;li&gt;当前 Google Play 环境是否支持显示该应用&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;账单地址怎么填更稳妥&lt;/h3&gt;
&lt;p&gt;如果比起省税费你更在意稳定，建议按这个顺序确认：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;优先以银行卡发卡行登记的账单地址为准&lt;/li&gt;
&lt;li&gt;持卡人姓名、卡号、账单地址尽量保持一致&lt;/li&gt;
&lt;li&gt;不确定发卡行预留地址的，先联系银行客服确认&lt;/li&gt;
&lt;li&gt;不要用地址生成器、代填地址或所谓“免税州地址”去试&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;订阅成功但会员没生效怎么办&lt;/h3&gt;
&lt;p&gt;可以依次试试：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;退出并重新登录 ChatGPT App&lt;/li&gt;
&lt;li&gt;等几分钟后刷新订阅状态&lt;/li&gt;
&lt;li&gt;到 Google Play 的订阅页面确认付款是否成功&lt;/li&gt;
&lt;li&gt;还不行就联系 Google Play 或 OpenAI 官方支持&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;最后几点提醒&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;不要在非官方渠道买所谓的低价会员或代充服务&lt;/li&gt;
&lt;li&gt;订阅扣费、退款和取消订阅通常由 Google Play 管理&lt;/li&gt;
&lt;li&gt;会员权益和可用功能以 ChatGPT App 内实际展示为准&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>打造完美的网络分流体验：订阅转换与自定义规则指南</title><link>https://blog.961121.xyz/posts/subscription-conversion-custom-rules/</link><guid isPermaLink="true">https://blog.961121.xyz/posts/subscription-conversion-custom-rules/</guid><description>如何使用 ACL4SSR 在线工具配合自定义规则，让你的代理软件分流更智能。包含策略组详解与避坑指南。</description><pubDate>Thu, 12 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;日常用 Clash、Surge、Sing-box 这类代理软件时，机场默认订阅的规则往往比较臃肿，分流不够准，也不一定符合自己的使用习惯。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;订阅转换&lt;/strong&gt;（Subscription Converter）就是解决这个问题的：把原始订阅链接转换成各客户端能用的格式，同时换上自己的&lt;strong&gt;分流规则&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;这篇记录一下我用在线工具加载自己维护的规则（CustomRules）的流程，顺便解释转换后那些策略组各自是干什么的，遇到“节点连不上”时也好自己排查。&lt;/p&gt;
&lt;h2&gt;工具准备&lt;/h2&gt;
&lt;p&gt;需要两个东西：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;在线订阅转换工具&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://acl4ssr-sub.github.io/&quot;&gt;打开 ACL4SSR 在线转换&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;这是一个基于 Subconverter 搭建的前端页面，界面简洁，支持输出多种主流客户端格式。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;个人自用规则（Remote Config）&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;规则地址&lt;/strong&gt;（点击右侧复制按钮）：&lt;pre&gt;&lt;code&gt;https://raw.githubusercontent.com/lkhmm520/ssr-rules/refs/heads/main/CustomRules.ini
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;这是我按日常开发和使用习惯整理的规则集，包含去广告、国内直连优化和流媒体分流。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;:::note
&lt;strong&gt;为什么不直接用机场自带规则？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;相比机场默认配置，这套规则有几个好处：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;去广告&lt;/strong&gt;：内置了广告拦截规则。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分流更准&lt;/strong&gt;：区分国内外流量，访问百度不会绕道代理。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对开发友好&lt;/strong&gt;：GitHub、StackOverflow 等常用站点做了单独处理。
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;基础流程：转换订阅&lt;/h2&gt;
&lt;h3&gt;第一步：填写基础信息&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;打开 &lt;a href=&quot;https://acl4ssr-sub.github.io/&quot;&gt;ACL4SSR&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;在 &lt;strong&gt;“订阅链接”&lt;/strong&gt; 中粘贴你的机场订阅地址（多个链接用 &lt;code&gt;|&lt;/code&gt; 分隔，或直接换行）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;“后端地址”&lt;/strong&gt; 建议选自建后端，或 &lt;code&gt;api.wcc.best&lt;/code&gt; 这类可用性较好的后端，转换更稳定。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;第二步：加载自定义规则（关键）&lt;/h3&gt;
&lt;p&gt;在 &lt;strong&gt;“远程配置”&lt;/strong&gt; 下拉框中选择 &lt;strong&gt;“Custom（自定义）”&lt;/strong&gt;，把上面准备好的规则地址粘贴进去。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./step_config.png&quot; alt=&quot;在进阶模式的远程配置中填入自定义规则 URL&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;第三步：生成并导入&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;客户端&lt;/strong&gt;：选择你使用的软件（如 Clash、Surge 等）。&lt;/li&gt;
&lt;li&gt;点击 &lt;strong&gt;“生成订阅链接”&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;点击 &lt;strong&gt;“一键导入”&lt;/strong&gt;，客户端里就能看到新的配置文件。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;用网页功能微调节点&lt;/h2&gt;
&lt;p&gt;如果不想 fork 代码，只是想过滤掉一些没用的节点（比如“过期时间”“官网”这类信息节点），或者只保留特定国家的节点，直接用 ACL4SSR 网页自带的高级功能就够了。&lt;/p&gt;
&lt;p&gt;点击页面上的 &lt;strong&gt;“更多选项”&lt;/strong&gt; 展开高级菜单：&lt;/p&gt;
&lt;h3&gt;排除节点（Exclude Nodes）&lt;/h3&gt;
&lt;p&gt;有些机场订阅里混着不少纯信息节点，可以按关键词过滤掉。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;操作&lt;/strong&gt;：在“排除节点”输入框中填写正则表达式。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;pre&gt;&lt;code&gt;(流量|时间|官网|产品|过期|剩余)
&lt;/code&gt;&lt;/pre&gt;
名字里包含“流量”“官网”等字眼的节点都会被丢弃。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;包含节点（Include Nodes）&lt;/h3&gt;
&lt;p&gt;如果只想保留某几个地区的节点（比如美国、日本、新加坡），用这个。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;操作&lt;/strong&gt;：在“包含节点”输入框中填写。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;pre&gt;&lt;code&gt;(US|SG|JP|美国|新加坡|日本)
&lt;/code&gt;&lt;/pre&gt;
转换出的订阅将只保留匹配这些关键词的节点，其余全部丢弃。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;重命名节点&lt;/h3&gt;
&lt;p&gt;机场节点命名混乱的话，可以用“正则替换”批量改名。比如把 &lt;code&gt;[高级机场] 香港 01&lt;/code&gt; 改成 &lt;code&gt;🇭🇰 香港 01&lt;/code&gt;，列表会整齐不少。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;策略组说明：转换后怎么选&lt;/h2&gt;
&lt;p&gt;导入后会看到一堆“自动选择”“手动选择”“漏网之鱼”，这里按我的规则逻辑逐个解释，方便按场景选择。&lt;/p&gt;
&lt;h3&gt;节点选择（Proxy）&lt;/h3&gt;
&lt;p&gt;总开关，决定所有需要走代理的流量默认走哪条路。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;推荐设置&lt;/strong&gt;：&lt;code&gt;自动选择&lt;/code&gt; 或 &lt;code&gt;手动选择&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;自动选择（Auto / UrlTest）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;机制&lt;/strong&gt;：客户端自动测试所有节点的延迟，切换到延迟最低的那个。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;适用场景&lt;/strong&gt;：不想操心选节点的话，用它就行。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;漏网之鱼（Final / Match）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;含义&lt;/strong&gt;：当一个网址既不在国内直连名单，也不在广告屏蔽名单，没有命中任何规则时，就会落到这里。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;推荐设置&lt;/strong&gt;：&lt;code&gt;节点选择&lt;/code&gt; 或 &lt;code&gt;自动选择&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;注意&lt;/strong&gt;：如果某些冷门国外网站打不开，先检查这个选项是不是被设成了 &lt;code&gt;Direct（直连）&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;AI 平台（ChatGPT / Gemini / Claude）&lt;/h3&gt;
&lt;p&gt;OpenAI 等平台对地区限制很严，这一组需要单独注意。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;不要选&lt;/strong&gt;香港（HK）、澳门（MO）或台湾（TW）节点，很容易被封号或无法访问。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;建议&lt;/strong&gt;手动指定&lt;strong&gt;新加坡（SG）&lt;/strong&gt;、&lt;strong&gt;日本（JP）&lt;/strong&gt; 或 &lt;strong&gt;美国（US）&lt;/strong&gt; 节点。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;流媒体与应用分组（Netflix、Telegram 等）&lt;/h3&gt;
&lt;p&gt;规则里对常见服务做了独立分组。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;作用&lt;/strong&gt;：可以给 Netflix 单独指定一个“新加坡”节点，同时让 Telegram 走“美国”节点，互不干扰。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;推荐设置&lt;/strong&gt;：&lt;code&gt;自动选择&lt;/code&gt;，或手动指定对应地区的节点。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;广告拦截（AdBlock）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;推荐设置&lt;/strong&gt;：&lt;code&gt;REJECT&lt;/code&gt;（拒绝连接）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作用&lt;/strong&gt;：直接阻断广告域名的请求，省流量，页面也干净。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;自己维护规则&lt;/h2&gt;
&lt;p&gt;如果对现有规则还有不满意的地方，想自己定义策略组，可以直接改模板。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;CustomRules.ini&lt;/code&gt; 本质上是一个模板文件，里面可以定义：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Rule Sets（规则集）&lt;/strong&gt;：引用外部的 list 文件（如 GeoIP、AdBlock 列表）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Proxy Groups（策略组）&lt;/strong&gt;：定义“自动选择”“手动选择”“故障转移”等分组逻辑。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;想在我的规则基础上改，可以 fork &lt;a href=&quot;https://github.com/lkhmm520/ssr-rules&quot;&gt;&lt;code&gt;lkhmm520/ssr-rules&lt;/code&gt;&lt;/a&gt;，修改 &lt;code&gt;CustomRules.ini&lt;/code&gt; 后，在转换时填入你自己的 Raw URL 即可。&lt;/p&gt;
</content:encoded></item><item><title>Codex CLI 使用指南</title><link>https://blog.961121.xyz/posts/codex-cli/</link><guid isPermaLink="true">https://blog.961121.xyz/posts/codex-cli/</guid><description>这是一个基于 Codex 的命令行工具，能让你直接在终端与 AI 对话，无需切换浏览器。本文介绍了它的安装、配置及常用命令。</description><pubDate>Thu, 29 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Codex CLI 是 OpenAI 推出的终端编码代理：不用切浏览器，直接在本地仓库里和 AI 对话，它能读你的文件、执行命令、改代码，而且每一步执行都有审批机制兜底。如果你习惯待在终端里干活，又厌倦了在网页 Chat 和编辑器之间来回粘贴上下文，这个工具值得一试。&lt;/p&gt;
&lt;p&gt;这篇文章把我整理的安装、常用命令、AGENTS.md、MCP 和 Skills 的用法都过一遍，基本覆盖日常使用场景。&lt;/p&gt;
&lt;h2&gt;为什么选 Codex CLI&lt;/h2&gt;
&lt;p&gt;先用一张表对比它和传统网页 Chat 的差异，核心就是&quot;上下文&quot;和&quot;可控性&quot;这两点：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;维度&lt;/th&gt;
&lt;th&gt;传统 AI Chat 对话&lt;/th&gt;
&lt;th&gt;Codex CLI&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;td&gt;终端统一入口，直接在本地仓库内工作（编辑器无关）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;上下文&lt;/td&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;td&gt;内建审批模式与会话状态，可控制何时执行命令&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;复用能力&lt;/td&gt;
&lt;td&gt;以对话模板/复制粘贴为主&lt;/td&gt;
&lt;td&gt;支持内置 Slash 命令、可扩展 Prompt 与 Skill&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;扩展&lt;/td&gt;
&lt;td&gt;需要手动切换外部工具&lt;/td&gt;
&lt;td&gt;通过 MCP 接入第三方工具与上下文（如 Figma）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;安装与启动&lt;/h2&gt;
&lt;p&gt;全局装一个 npm 包就行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm i -g @openai/codex
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后进入你的项目目录，直接运行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;codex
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;首次运行会提示登录，用 ChatGPT 账号或 API key 都可以。&lt;/p&gt;
&lt;h2&gt;常用快捷键&lt;/h2&gt;
&lt;p&gt;进入交互界面后，这几个快捷键用得最多，建议先记住 &lt;code&gt;/&lt;/code&gt;、&lt;code&gt;@&lt;/code&gt; 和 &lt;code&gt;!&lt;/code&gt; 三个：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;/：命令列表&lt;/li&gt;
&lt;li&gt;!：Shell 命令&lt;/li&gt;
&lt;li&gt;Ctrl+J：换行&lt;/li&gt;
&lt;li&gt;@：补全文件路径&lt;/li&gt;
&lt;li&gt;Ctrl+G：外部编辑器输入&lt;/li&gt;
&lt;li&gt;Ctrl+T：查看对话记录&lt;/li&gt;
&lt;li&gt;Ctrl+C：退出&lt;/li&gt;
&lt;li&gt;Tab：排队发送消息&lt;/li&gt;
&lt;li&gt;Ctrl+V：粘贴图片（Mac/Windows/Linux 通用）&lt;/li&gt;
&lt;li&gt;Esc Esc：编辑上一条消息&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Slash 命令速查&lt;/h2&gt;
&lt;p&gt;在 CLI 里输入 &lt;code&gt;/&lt;/code&gt; 会弹出命令列表，支持模糊过滤。内置命令不多，一张表就能列全：&lt;/p&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;/approvals&lt;/td&gt;
&lt;td&gt;设置审批模式（例如只读/自动/需确认）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/compact&lt;/td&gt;
&lt;td&gt;对话压缩，保留要点&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/diff&lt;/td&gt;
&lt;td&gt;查看 Git diff（含未跟踪文件）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/exit /quit&lt;/td&gt;
&lt;td&gt;退出 CLI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/feedback&lt;/td&gt;
&lt;td&gt;发送诊断与反馈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/init&lt;/td&gt;
&lt;td&gt;生成 AGENTS.md 模板&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/logout&lt;/td&gt;
&lt;td&gt;退出登录&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/mcp&lt;/td&gt;
&lt;td&gt;查看已配置 MCP 工具&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/mention&lt;/td&gt;
&lt;td&gt;添加文件/路径到上下文&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/model&lt;/td&gt;
&lt;td&gt;切换模型&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/new&lt;/td&gt;
&lt;td&gt;开新对话（同目录）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/review&lt;/td&gt;
&lt;td&gt;代码/改动审查&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/status&lt;/td&gt;
&lt;td&gt;查看会话配置与状态&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/undo&lt;/td&gt;
&lt;td&gt;撤销最近一次变更&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;一套典型的工作流程&lt;/h2&gt;
&lt;p&gt;上面的命令单看有点抽象，串成一个实际流程就清楚了：初始化、设权限、加上下文、看改动、审查。&lt;/p&gt;
&lt;h3&gt;初始化项目指令&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;/init
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;生成 AGENTS.md 模板，作为项目级指令入口，后面会专门讲怎么写。&lt;/p&gt;
&lt;h3&gt;限制或放开权限&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;/approvals
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;选择审批策略（例如只读/自动/需确认）。第一次用建议保守一点，熟了再放开。&lt;/p&gt;
&lt;h3&gt;把关键文件加入上下文&lt;/h3&gt;
&lt;p&gt;这一步的核心是：把你正在处理的关键文件加入上下文，不必拘泥固定路径。两种常见场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果有现成文件（例如纯 HTML 待办演示）：&lt;pre&gt;&lt;code&gt;/mention index.html
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;如果目录暂时还不存在（或准备新建）：&lt;pre&gt;&lt;code&gt;/mention README.md
&lt;/code&gt;&lt;/pre&gt;
然后让 Codex 生成/创建你要的目标文件。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;文件加入上下文后，后续指令会自动带上，联动修改很方便。&lt;/p&gt;
&lt;h3&gt;查看和审查改动&lt;/h3&gt;
&lt;p&gt;改完之后先看 diff，再让它自己审一遍：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/diff
/review
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;实战：生成一个纯 HTML 待办页&lt;/h2&gt;
&lt;p&gt;拿一个完整例子走一遍上面的流程。目标：生成一个可直接打开的静态待办页面（HTML + CSS + 原生 JS，支持本地保存）。&lt;/p&gt;
&lt;p&gt;先准备一个空项目：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir codex-demo-page
cd codex-demo-page
touch index.html
codex
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后在 Codex CLI 里直接描述需求：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;请生成一个纯 HTML 待办事项页面：包含任务输入、列表、完成状态、筛选（全部/未完成/已完成），数据存 localStorage；要求响应式、排版清晰、配色干净。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;生成后检查改动：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/diff
/review
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;想在浏览器里看效果，起个本地服务即可：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python -m http.server 8000
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;AGENTS.md：给仓库写持续指令&lt;/h2&gt;
&lt;p&gt;AGENTS.md 的作用是为当前仓库提供持续生效的指令，Codex 会自动读取并遵守——相当于把你每次都要重复交代的规矩写死在仓库里。用 &lt;code&gt;/init&lt;/code&gt; 就能生成模板。&lt;/p&gt;
&lt;p&gt;下面是我推荐的模板结构，可以直接复制改：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# AGENTS.md

## Repository Guidelines

### 项目结构与模块组织
- 说明主要目录与模块的职责边界
- 指出入口文件与页面组件位置

### 构建与开发命令
- 统一列出安装、开发、构建、预览命令

### 编码风格
- 缩进、命名规范、组件职责边界

### 数据存储与约束
- localStorage key 命名、后端接口、字段约束

### 代码审查重点
- 修改功能时需补充的测试点
- 高风险模块注意事项

### 输出要求（每次改动后需说明）
- 说明改动内容（做了什么）
- 说明影响范围（哪些文件/模块/功能受影响）
- 提供回滚或兜底方案（如何恢复到改动前）
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;MCP：接入外部工具&lt;/h2&gt;
&lt;p&gt;MCP（Model Context Protocol）让 Codex 能接入第三方工具与上下文，比如设计稿、浏览器、文档。下面以 Figma 为例，两种配置方式任选。&lt;/p&gt;
&lt;p&gt;方式一，直接用命令行添加：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 使用 HTTP MCP Server（以 Figma 为例，URL 以实际服务商提供为准）
codex mcp add figma --url https://mcp.figma.com/mcp

# 查看已配置的 MCP 列表
codex mcp list
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;方式二，写配置文件（项目级或全局都行）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# ~/.codex/config.toml 或 &amp;lt;repo&amp;gt;/.codex/config.toml
[mcp_servers.figma]
url = &quot;https://mcp.figma.com/mcp&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配置好之后，在 CLI 里输入 &lt;code&gt;/mcp&lt;/code&gt; 就能查看已接入的工具。&lt;/p&gt;
&lt;h2&gt;Skills：把常用流程封装成可复用能力&lt;/h2&gt;
&lt;p&gt;如果你有一套固定流程反复在用（比如每天生成日报），可以封装成 Skill。&lt;/p&gt;
&lt;h3&gt;一个 Skill 长什么样&lt;/h3&gt;
&lt;p&gt;Skill 就是一个文件夹，核心是 &lt;code&gt;SKILL.md&lt;/code&gt;（必需），外加可选的 &lt;code&gt;scripts/&lt;/code&gt;、&lt;code&gt;references/&lt;/code&gt;、&lt;code&gt;assets/&lt;/code&gt;。&lt;code&gt;SKILL.md&lt;/code&gt; 用 YAML Front Matter 描述元信息（至少 &lt;code&gt;name&lt;/code&gt; 与 &lt;code&gt;description&lt;/code&gt;），正文写具体流程说明。&lt;/p&gt;
&lt;h3&gt;怎么触发&lt;/h3&gt;
&lt;p&gt;Codex 启动时会扫描可用 Skill，但只读取 &lt;code&gt;name&lt;/code&gt; 与 &lt;code&gt;description&lt;/code&gt; 用于匹配；只有被触发时才加载完整内容，所以不用担心 Skill 多了拖慢上下文。触发方式两种：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;显式：输入 &lt;code&gt;/skills&lt;/code&gt; 选择，或在提示中直接写 &lt;code&gt;$skill-name&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;隐式：当任务描述与 Skill 的 &lt;code&gt;description&lt;/code&gt; 匹配时，Codex 自动启用&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;保存位置&lt;/h3&gt;
&lt;p&gt;Codex 会按由近到远的顺序扫描这些目录：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;$CWD/.codex/skills&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$CWD/../.codex/skills&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$REPO_ROOT/.codex/skills&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$CODEX_HOME/skills&lt;/code&gt;（macOS/Linux 默认 &lt;code&gt;~/.codex/skills&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/codex/skills&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;系统内置 Skills（随 Codex 发布）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;注意同名 Skill 不会去重，选择器里可能同时出现多个。技能目录用软链接也是支持的。&lt;/p&gt;
&lt;h3&gt;创建与安装&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;方式 1：使用内置 &lt;code&gt;$skill-creator&lt;/code&gt;&lt;/strong&gt;
在 Codex CLI 中描述你要的能力，Codex 会引导你创建 Skill。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;方式 2：手动创建&lt;/strong&gt;
在任意有效技能目录下创建文件夹与 &lt;code&gt;SKILL.md&lt;/code&gt;，保存后重启 Codex 生效。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;安装官方示例（experimental）&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$skill-installer install the create-plan skill from the .experimental folder
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装完成后同样需要重启 Codex。&lt;/p&gt;
&lt;h3&gt;SKILL.md 完整示例&lt;/h3&gt;
&lt;p&gt;拿一个&quot;生成 git 日报&quot;的 Skill 做例子，可以直接复制改：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
name: Daily Git Log Report
description: 根据指定目录路径生成日报摘要
---

## 目标
在指定仓库与目录范围内，收集当天 git log 并生成日报摘要。

## 输入要求
在执行前向用户确认以下信息：
1) REPO_PATH：仓库路径（绝对路径）
2) FOCUS_PATH：仅统计的目录或文件路径（相对 REPO_PATH）
3) DATE：日报日期（YYYY-MM-DD；若未提供则使用当天）

## 执行步骤
1) 在 shell 中执行 git log，范围限定为 DATE 当天。
2) 排除 merge commit。
3) 输出清单 + 摘要两段。

## 命令模板
git -C &quot;$REPO_PATH&quot; log \
  --since &quot;$DATE 00:00&quot; \
  --until &quot;$DATE 23:59&quot; \
  --no-merges \
  --date=short \
  --pretty=format:&quot;%h %ad %s (%an)&quot; \
  -- &quot;$FOCUS_PATH&quot;

## 输出格式

### Commit 清单

- 逐条列出：hash + 日期 + 标题 + 作者

### 日报摘要

- 归纳为 3~6 条重点
- 按功能模块或主题归类
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;没有 Hooks？替代方案&lt;/h2&gt;
&lt;p&gt;官方文档目前聚焦在 Slash 命令、Skills 和 MCP 上，没有描述与&quot;自动触发 Hook&quot;等价的机制。想要类似效果，可以这样绕：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Git hooks：在 pre-commit / pre-push 中调用 Codex 或固定脚本&lt;/li&gt;
&lt;li&gt;Skills：把流程固化成可分享的能力（比脚本更可读）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;Codex CLI 本质上是一个跑在终端里的本地编码代理，直接在你的仓库里执行、编辑与协作。它解决的是网页 Chat 的几个老问题：上下文零散、工具切换频繁、流程难复用、权限不可控。上手成本不高，装完先用 &lt;code&gt;/init&lt;/code&gt; 和 &lt;code&gt;/approvals&lt;/code&gt; 把规矩立好，再把常用流程沉淀成 AGENTS.md 和 Skills，日常开发里能省下不少重复沟通。&lt;/p&gt;
&lt;h2&gt;参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.openai.com/codex/cli&quot;&gt;Codex CLI 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.openai.com/codex/cli/slash-commands&quot;&gt;Slash 命令参考&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.openai.com/codex/skills&quot;&gt;Skills 文档&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item></channel></rss>