
Why Shirone?
在检索“如何将大肥鱼接入 QQ 机器人”的教程时,我偶然刷到一个看起来不错的博客,翻了几个友链发现用的都是同一套主题,于是记下了那个主题的名字——Mizuki。一番调研后了解到该 主题仓库 已停止维护了,项目重构升级后迁到了 Shirone。
当时主要是看中了该主题提供的丰富的独立页面,甚至还有 追番展示 页面。当然,考虑到站点迁移的工作量与我并不充裕的时间,这些还不足以让我下定决心放弃现有的博客。
决定性的因素是该 主题模板 提供的一整套架构设计与性能优化方案,其中 双仓架构、实时监听 与 构建优化 尤为突出,切实解决了此前搭建与维护博客遇到的一些痛点。
遂决定忙里偷闲也要把博客搬过去。
于是按照某种惯例,这次也分享一下搭建博客的大致步骤与过程中踩的一些坑。
前置准备
环境配置
首先需要准备以下工具:
| 工具 | 作用 | 举例 |
|---|---|---|
| AI Agent | 核心出装,零基础的基础 | Codex、DSH、omp 等,视自身需求选用 |
| IDE | 编辑代码 | 微软大战代码 |
| Markdown 编辑器 | 写文章 | Obsidian,或安装 IDE 插件 |
| Git | 拉取上游仓库更新与推送本地仓库 | 安装一个适配本机的版本即可 |
| GitHub | 托管网站仓库,部署网页(可选) | 注册账号用网页版即可 |
| Node.js | 管理主题模板依赖与执行内置命令 | 建议安装最新版,并在选择版本时注意适配 pnpm |
然后找一个合适的目录用于存放网站文件,不妨称之为 /site。
在该目录下打开终端并执行环境检查:
git -vnode -vpnpm -v正常输出版本号则环境已配好。
主题准备
然后拉取两个仓库:
git clone https://github.com/LyraVoid/Shirone.git themegit clone https://github.com/LyraVoid/Shirone-Content.git blog-content这里的 theme 和 blog-content 为主题仓和内容仓的文件夹命名,可以任意定义,下文统一以此指代主题仓和内容仓,注意命令中的命名替换。
然后在 GitHub 上创建两个仓库:一个公共仓库用于托管主题仓,一个私有仓库 blog-content(内容仓)用于托管 /blog-content。内容仓的命名可以任意定义,主题仓的命名规则见下方须知。
接着,我们需要将两个仓库的远程地址重定向为自己的仓库。
主题仓:
cd theme# 将原地址重命名为upstreamgit remote rename origin upstream# 添加自己的仓库地址git remote add origin git@github.com:你的用户名/你的用户名.github.io.git# 最后检验仓库地址状态git remote -v若两个仓库地址都在,则配置完成。
内容仓:
cd blog-contentgit remote rename origin upstreamgit remote add origin git@github.com:你的用户名/blog-content.gitgit remote -v同上。
如此配置,推送时 push 到 origin,更新时 fetch 自 upstream。需要注意的是,要严格贯彻双仓分离的原则,自己的配置、文章、图片等各种项目资产全部放到内容仓,主题仓中不作任何改动。在 merge 时,主题仓以上游为准,内容仓的情况比较复杂,可能存在一些冲突(如配置表更新)需要手动微调。
为了让主题仓能读取内容仓的文件,需要在 /theme 下新建一个文件 .env,内容建议直接从已有的 .env.example 复制粘贴,然后将被注释的三行代码编辑为:
CONTENT_DIR="blog-content的绝对目录"CONTENT_REPO_URL="https://github.com/你的用户名/blog-content.git"CONTENT_REPO_REF="main"然后在同目录下的 .gitignore 文件中新增一行:
.env这样就可以防止环境变量被上传到主题仓库。
最后在主题仓安装依赖,并预览确认默认网页的状态:
cd themepnpm installpnpm dev命令运行输出绿字后,打开浏览器 localhost:4321 即可本地预览网页状态。
至此,就可以开始正式的网站搭建了。
初识 Shirone
项目概览
首先大概看一下 /theme 的文件结构:
public纯静态资源(favicon、robots.txt 等无需编译的文件)
- favicon.svg站点主图标
src核心源码目录
assets由 Vite / Astro 处理的静态资源(默认横幅、插画)
- fonts本地字体文件与构建期子集产物
- componentsSvelte 5 原子组件与 Astro 业务模块
- config强类型站点配置文件群
- contentMarkdown 文章与独立数据集合
- i18n多语言文案与语言包
- integrationAstro 集成入口(路由注入、字体子集、图标收集、缩略图生成)
- layouts顶层页面布局(Layout.astro、MainGridLayout.astro)
- pages静态路由与动态页面生成
- stylesM3 Expressive Tokens 与全局 CSS 样式
- user用户配置覆盖层(由 content:sync 生成,勿手改)
- utils算法工具库(WebCrypto、动态配色、音频单例)
scripts自动化构建与离线同步脚本
anime
- sync.mjsBangumi / Bilibili 追番数据同步入口
- astro.config.mjsAstro 顶层配置文件(集成 Svelte、Swup、Tailwind)
- svelte.config.jsSvelte 5 编译器配置(启用 Runes 响应式)
- tsconfig.jsonTypeScript 路径映射与严格模式
- package.json项目依赖与脚本命令
- pnpm-lock.yaml锁版本清单
其中,主题仓在双仓模式下一般不需要改动,了解大致用途即可。
因为网站在执行构建时,会用内容仓中的配置覆盖主题仓的配置。我们需要关注的是 /blog-content :
.github
workflows
- trigger-build.yml.example跨仓触发 GitHub Actions 模板
config全站声明式配置 YAML 文件群
- site.yaml站点标识、时区、色彩与横幅壁纸
- permalink.yaml全局文章固定链接与占位符规则
- profile.yaml博主头像、昵称、签名与社交外链
- nav-bar.yaml顶部导航栏条目与下拉菜单
- sidebar.yaml侧边栏布局与组件清单
- font.yaml全站字体与字形裁剪配置
- anime.yaml追番追剧页面与同步数据源
- music.yaml侧栏播放器模式与歌单配置
- comment.yaml评论系统配置(Twikoo / Giscus / Waline)
- article.yaml文章排版与阅读提醒配置
- post-list.yaml首页文章列表与分页模式
- devices.yaml数码装备分类与筛选规则
- games.yaml游戏展示分类与筛选规则
- projects.yaml开源项目分类与阶段规则
- skills.yaml技能图谱分类与熟练度规则
- timeline.yaml大事记时间线分类规则
- friends.yaml友情链接分组规则
- announcement.yaml全局浮动公告栏配置
- expressive-code.yaml代码高亮与代码块行号
- context-menu.yaml桌面端右键增强菜单与操作项
- fab.yaml悬浮动作按钮 (FAB)
- image-bloom.yaml图片泛光视觉滤镜
- license.yaml原创知识共享协议 (CC)
- llms.yaml大模型 AI 检索增强
- umami.yamlUmami 访问统计分析
- series.yaml系列连载展示与索引配置
- footer.yaml页脚文案与备案信息
- footer.html自定义注入的页脚 HTML 片段
content原创文章、说说与页面文案
- postsMarkdown 与 MDX 博客长文 (如 guide.md)
- moments动态生活说说 (如 first-moment.md)
- series系列连载实体与导读 (如 guide-series.md)
- spec特殊页面文案 (about.md, friends.md)
data结构化数据实体 TypeScript 模块
- anime.ts追番本地数据快照
- compass.ts推荐导航与罗盘条目
- devices.ts硬件与数码设备清单
- games.ts游戏展示清单
- friends.ts友情链接清单
- music.ts本地音乐曲目数据
- projects.ts开源与个人项目清单
- skills.ts技能图谱与熟练度数据
- timeline.ts个人大事记时间线数据
assets自己的高清图片 (同步到代码仓 src/assets/,构建时自动压缩)
images
- banner顶部横幅背景图,分 desktop/ 与 mobile/ 两套
- music本地音乐的封面图
- author.jpg博主头像
- games游戏页面的横幅大图
public静态多媒体资源 (原样发布不转码)
- assets番剧封面与媒资缓存
images博客图片与相册
- albums摄影相册目录 (如 SampleAlbum/01.webp + info.json)
- docs内容仓结构说明与写作规范
- .gitignore
- README.md
- shirone.content.json内容仓库元数据(来源、挂载、保留与裁剪规则)
其中,这些是我们要用到的:
| 目录 | 用途 |
|---|---|
/config | 编辑所有的配置表 |
/content | 编辑文章、说说、系列与特殊页面的文案 |
/data | 编辑特殊页面的内容 |
/assets | 存放各种网站资产,图片、视频、音频等 |
/.github | 编辑 GitHub 工作流,把网页部署到 GitHub Pages 时用到 |
在配置的过程中逐一熟悉即可。
工作流
以下是开发实践中总结的一些常用操作,由基本指令组合而成,详见 快速开始 | 文档 | Shirone Docs 和 CLI 命令行工具链 | 文档 | Shirone Docs 。
调试:边改边看
在 /theme 下开两个终端,分别执行:
pnpm devpnpm content:watch之后在浏览器打开 localhost:4321,每当外部编辑器修改了网站文件,就会触发局部热重载,网页刷新后显示更新后的版本。
拉取上游更新
分主题仓和内容仓两种情况。
主题仓:
git fetch upstream --tagsgit merge upstream/main# 重新安装依赖并检查pnpm installpnpm check内容仓:
git fetch upstream --tags# 检查是否存在冲突git log --oneline HEAD..upstream/maingit merge upstream/main# 同步内容更改cd ..\blogpnpm content:sync推送更新
在内容仓目录下执行:
git add -Agit commit -m "本次更改概要"git push origin main如果需要提交主题仓的改动,请在 /theme 目录下执行(先清理构建期物化副本,避免把生成物提交进去):
# 先清理主题仓中的临时副本pnpm content:clean # 预演:打印清理计划pnpm content:clean --yes # 实际执行清理git add -Agit commit -m "本次更改概要"git push origin main配置调教:定制自己的网站
接下来,就可以在 主题模板 的基础上,更改配置项,制作属于自己的网站了。
由于配置中的个性化选项过多,且 官方文档 提供了详尽的引导,这里仅提供简略的指引,作为实操的参考。
基本流程
编辑配置的方法十分简单,用 IDE 打开内容仓目录,然后在 blog-content/config 下找到你要改的配置项。例如我想要修改网页的标题,这一项在 site.yaml 中,于是我打开该文件,然后根据代码中的注释与 官方文档 中对应的说明,完成修改。
如果想即时确认修改结果,参见上文的 边改边看。
配置顺序
下面是我编辑配置的顺序,可以作为实践参考。
修改建议说明:
- 必修:掌握每个配置项的用途并确认状态。
- 选修:依自身需求酌情配置,不想要可以关掉,一般是
enable: false。 - 开摆:没什么用或默认配置已经很完善了,想看看也行。
普通配置
| 配置项 | 配置文件 | 参考文档 | 修改建议 |
|---|---|---|---|
| 基础信息、配色、背景图等 | site.yaml | 基础配置、动态配色、横幅与背景 | 必修 |
| 博主资料 | profile.yaml | 页脚与博主资料 | 必修 |
| 顶部导航栏 | nav-bar.yaml | 导航栏配置 | 必修 |
| 左右侧栏 | sidebar.yaml | 侧栏布局、组件总览、基础组件 | 选修 |
| 公告栏 | announcement.yaml | 公告组件 | 选修 |
| 音乐播放器 | music.yaml | 音乐播放器、Meting API | 选修 |
| 页脚 | footer.yaml、footer.html | 页脚与博主资料 | 开摆 |
| 字体 | font.yaml | 自定义字体 | 选修 |
| 文章页面 | article.yaml | 文章页配置 | 开摆 |
| 悬浮控制 | fab.yaml | 悬浮控制流(FAB) | 开摆 |
| 右键菜单 | context-menu.yaml | 右键增强菜单 | 选修 |
| 版权声明 | license.yaml | 版权声明 | 选修 |
| 代码样式 | expressive-code.yaml | 代码块主题 | 选修 |
| 评论系统 | comment.yaml | 评论系统 | 选修 |
| Umami 统计 | umami.yaml | Umami 统计、Umami API | 选修 |
| AI 友好内容 | llms.yaml | 订阅与机器可读输出、LLM 友好内容 | 开摆 |
| 图片加载效果 | image-bloom.yaml | 图片色调辉光 | 开摆 |
| 全局永久链接 | permalink.yaml | 固定链接 | 开摆 |
独立页面配置
还有一些特殊的配置项,更改的是 独立页面(归档、分类、关于等)的内容,它们除修改 .yaml 配置文件外可能还需要额外修改一些文件来写入页面内容,这里单列:
| 独立页面 | 配置文件 | 内容文件 | 参考文档 | 修改建议 |
|---|---|---|---|---|
| 关于 | 无 | content/spec/about.md | 关于页 | 必修 |
| 动态 | 无 | content/moments/ | 瞬间页 | 选修 |
| 友链 | 无 | data/friends.ts | 友链页 | 必修 |
| 项目 | projects.yaml | data/projects.ts | 项目页 | 选修 |
| 技能 | skills.yaml | data/skills.ts | 技能页 | 选修 |
| 设备 | devices.yaml | data/devices.ts | 设备页 | 选修 |
| 游戏 | games.yaml | data/games.ts | 游戏页 | 选修 |
| 系列 | series.yaml | content/series/ | 系列页 | 选修 |
| 时间线 | timeline.yaml | data/timeline.ts | 时间线 | 选修 |
| 追番 | anime.yaml | 无 | 番剧页、Bangumi API、Bilibili API、数据快照与离线同步 | 选修 |
独立页面较多,根据自身需求选用即可,没有必要全用。也可以先做一部分,等到有需求后再增加。
在 Shirone 写作
编辑配置表使其不断适配个性化需求的过程是令人上头的,但不要忘记博客网站最初的目的——博客网站一定要有博客。
Shirone 为 Markdown 提供了丰富的格式支持与特性扩展,与一种合乎逻辑的 多文件夹 组织方式。
用 Markdown 写作
官方文档 提供了一份 入门教程,基本覆盖了 Markdown 的常用语法,以供快速上手。此外,还有大量的富文本特性有待探索。在此之前,我们需要准备一个 Markdown 文本编辑器,这里推荐 Obsidian,原因如下:
- 强大的插件生态
- 较低的学习成本
- 天然支持 Frontmatter
对于 Obsidian 用户,只需将 /blog-content 作为一个本地仓库(Vault)打开,就会在 /blog-content 下创建 .obsidian 文件,并将其新建为一个仓库。如果此前使用过 Obsidian 并已有一个配置完善的仓库,可以直接将它的 .obsidian 文件粘贴并替换该文件,让 /blog-content 仓库直接继承此前的所有配置项与插件。
编写并发布第一篇文章
以本文为例,首先在内容仓的博文目录下新建存放新文章的目录 /content/posts/site-building,然后在其下新建 site-building.md,并在文件开头填入:
---title: 零基础搭建并装修精致优雅的二次元博客网站permalink: site-buildingpublished: 2026-10-24publishedAt: 2026-10-24T14:25:41+08:00description: 基于 Astro 框架 + Shirone 主题的静态博客建站方案,在官方文档的基础上补充了基于实践经验的整理与引导,以便上手和学习。image: ./cover.pngtags: - 指南 - 博客category: 技术draft: falselang: zh-CN---这是博文的 Frontmatter,完整的配置项见 Frontmatter | 文档,这里只介绍重点:
文章的固定链接,如上填写则文章将固定在 网站地址/posts/site-building。
封面,如上填写,则会取同目录下的 cover.png 作为封面。
是否为草稿,填 true 不会发布,填 false 则会发布。
详见 编写文章 | 文档。
发个说说
上文提到的 独立页面 中,瞬间页 相当于 QQ 空间,可用于发布一些轻量的内容,如随想、灵感、日常等。
要发布一条说说,只需在 content/moments 下新建 .md 文件,建议命名为 日期-标题,例如 2026-10-24-first-moment.md。然后填写说说的 Frontmatter:
---published: 2026-10-24T21:30:00+08:00 # 发布时间(含时区),必填mood: material-symbols:sentiment-excited-outline-rounded # 心情图标tags: # 标签,用于筛选 - 随想images: # 图片排版数组 - src: /images/moments/arknights-7_5.webp alt: 《明日方舟》7.5周年活动---# 下为正文部分这里 mood 使用了来自 materiail-symbols 的图标,目前 Shirone 支持 Iconify 图标库中的图标,默认安装的库有 fa7-brands、fa7-solid、material-symbols 和 simple-icons。
想使用图标时,可以到 Icônes 查找想用的图标并复制图标全名。
另外,说说的配图建议集中写在 Frontmatter 中,并将图片资产统一存放于内容仓的 /public/images/moments 下。
各种特性
下面展示一部分 Shirone 支持的语法特性 。
GitHub 仓库卡片
::github{repo="LyraVoid/Shirone"}::github{repo="LyraVoid/Shirone-Content"}嵌入 Bilibili 视频
::bilibili{bvid="BV1KKtV69E8a" title="主题宣传视频" p=1 preload="auto"}折叠卡片
默认展开的项目
这里是第一个卡片的内容正文。
默认折叠的项目
这里是第二个卡片的内容正文。
部署网站
最后介绍如何将网站部署到不同的平台。
为此,我们需要准备:
这部分操作详见 官方文档 中的部署部分,建议从 本地构建 看起。这里仅介绍我采用的 GitHub Pages 部署方式。
GitHub Pages 部署
1. 基础配置
我需要将网站部署到 https://tghyscifi.github.io,因此编辑 site.yaml:
site: "https://tghyscifi.github.io"base: "/"2. 配置 GitHub Actions
托管在 GitHub 的仓库只包含了源代码,我们需要告诉 GitHub 的云服务如何构建网站,因此需要编辑 GitHub Actions 工作流,内容仓与主题仓各一个。
内容仓
在 /blog-content/.github/workflows 下新建 trigger-build.yml:(参考 trigger-build.yml.example)
name: Trigger Theme Build
on: push: branches: - main paths: - "content/**" - "config/**" - "data/**" - "assets/**" - "public/**" - "shirone.content.json" workflow_dispatch: {}
concurrency: group: trigger-build cancel-in-progress: true
jobs: validate: uses: LyraVoid/Shirone/.github/workflows/content-validate.yml@main with: theme_repository: LyraVoid/Shirone theme_ref: main
dispatch: needs: validate runs-on: ubuntu-latest timeout-minutes: 5 steps: - name: Dispatch build event to theme repository env: DISPATCH_TOKEN: ${{ secrets.DISPATCH_TOKEN }} if: ${{ env.DISPATCH_TOKEN != '' }} uses: peter-evans/repository-dispatch@v4 with: token: ${{ env.DISPATCH_TOKEN }} repository: tghyscifi/tghyscifi.github.io # TODO: 使用者请替换为自己的主题代码仓 event-type: content-updated client-payload: '{"sha": "${{ github.sha }}"}'主题仓
在 /theme/.github/workflows 下新建 deploy.yml:(参考 deploy.yml.example)
name: Deploy
on: push: branches: [main] paths-ignore: - "docs/**" - "rules/**" - "README*.md" - "*.md" repository_dispatch: types: [content-updated] workflow_dispatch: inputs: content_ref: description: "内容仓 ref 或 commit SHA(留空使用 main)" required: false default: "" schedule: - cron: "17 4 * * *"
concurrency: group: deploy cancel-in-progress: true
permissions: contents: read pages: write id-token: write
env: CONTENT_REPOSITORY: tghyscifi/blog-content # TODO: 替换为你的内容仓。 CONTENT_WORKING_COPY: .content-src
jobs: deploy: name: Build and deploy runs-on: ubuntu-latest timeout-minutes: 20 environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} env: CI: true CONTENT_DIR: .content-src
steps: - name: Resolve content ref id: target env: PAYLOAD_SHA: ${{ github.event.client_payload.sha }} INPUT_REF: ${{ github.event.inputs.content_ref }} run: | set -euo pipefail ref="${PAYLOAD_SHA:-}" [ -n "$ref" ] || ref="${INPUT_REF:-}" [ -n "$ref" ] || ref="main" echo "ref=$ref" >> "$GITHUB_OUTPUT"
- name: Checkout theme uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Checkout content uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: repository: ${{ env.CONTENT_REPOSITORY }} ref: ${{ steps.target.outputs.ref }} path: ${{ env.CONTENT_WORKING_COPY }} token: ${{ secrets.CONTENT_REPO_TOKEN }} persist-credentials: false
- name: Record content commit id: content run: | set -euo pipefail echo "sha=$(git -C '${{ env.CONTENT_WORKING_COPY }}' rev-parse HEAD)" >> "$GITHUB_OUTPUT"
- name: Set up pnpm uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 with: run_install: false
- name: Set up Node.js uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4.3.0 with: node-version: 22 cache: pnpm cache-dependency-path: pnpm-lock.yaml
- name: Restore build caches uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | public/assets/moments/thumbnails key: ${{ runner.os }}-shirone-thumbnails-${{ hashFiles('pnpm-lock.yaml') }} restore-keys: | ${{ runner.os }}-shirone-thumbnails-
- name: Install dependencies run: pnpm install --frozen-lockfile --prefer-offline
- name: Materialize content and config run: pnpm content:sync
- name: Restore anime cache uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | src/data/anime-snapshots public/assets/anime/covers key: ${{ runner.os }}-shirone-anime-${{ hashFiles('pnpm-lock.yaml') }} restore-keys: | ${{ runner.os }}-shirone-anime-
- name: Sync anime data (best effort) run: pnpm anime:sync --if-stale env: BILI_SESSDATA: ${{ secrets.BILI_SESSDATA }}
- name: Build site run: pnpm build env: BILI_SESSDATA: ${{ secrets.BILI_SESSDATA }}
- name: Upload Pages artifact uses: actions/upload-pages-artifact@v3 with: path: dist
- name: Deploy to Pages id: deployment uses: actions/deploy-pages@v4
- name: Summarize if: always() run: | set -euo pipefail { echo "### Shirone deploy" echo "" echo "- 内容仓:\`${CONTENT_REPOSITORY}\`" echo "- 内容 ref:\`${{ steps.target.outputs.ref }}\`" echo "- 内容 commit:\`${{ steps.content.outputs.sha }}\`" if [ -f content.lock.json ]; then echo "" echo "<details><summary>content.lock.json</summary>" echo "" echo '```json' cat content.lock.json echo '```' echo "" echo "</details>" fi } >> "$GITHUB_STEP_SUMMARY"3. 编辑仓库设置
由于有两个仓库,跨仓构建要求两个仓库之间的通信,这就需要生成两个 GitHub PAT,点此直达:New Fine-grained Personal Access Token。
先生成一个 shirone-dispatch,选择一个有效期(建议 90 天并定期轮换,不建议设为永久),将 Repository access 设置为 Only select repositories,并选择主题仓,最后在 Repository permissions 下找到 Contents,设为 Read and write,点击生成后立刻复制下来。
再进入内容仓的 Setting 页面,在 Secrets and variables -> Actions 点击 New repository secret,密钥名为 DISPATCH_TOKEN,其值为刚才复制的内容。
填写完毕后,按相同的流程生成第二个 PAT,这次命名为 shirone-content-read,Only select repositories 选择内容仓,Repository permissions.Contents 改为 Read(只读即可)。之后在主题仓的密钥界面新建密钥 CONTENT_REPO_TOKEN,并粘贴密钥值。
两次操作总结如下:
| PAT | shirone-dispatch | shirone-content-read |
|---|---|---|
| 有效期 | 自定义 | 自定义 |
Repository access | Only select repositories | Only select repositories |
| 选中仓库 | 主题仓 | 内容仓 |
Repository permissions.Contents | Read and write | Read |
| 所在仓库 | 内容仓 | 主题仓 |
| 密钥名 | DISPATCH_TOKEN | CONTENT_REPO_TOKEN |
配置完成后,在主题仓库的 Setting 页,将 Pages->Source 改为 GitHub Actions 并保存。
之后,先推送主题仓,再推送内容仓,GitHub Actions 跑完后,网站就部署完毕了。
个人访问令牌个人访问令牌个人访问令牌分享文章
生成精美分享图或复制链接,与更多人分享本文。
继续阅读
换条路线
从其他文章中稳定抽取
最后更新于 ,距今已过 2 天
部分内容可能已过时
评论
评论加载失败