骆家有男,人称明裕 —— 博客 · 知识库 · 个人简历,合而为一。
一个基于 VuePress 2 + vuepress-theme-hope 的个人站点,把原来的博客与在线简历合并成同一个站点, 采用深空星空视觉(参考 linverse.cn 的设计语言:深空底色、星云渐晕、 Canvas 星场、衬线标题、柔紫强调色、纸感颗粒),并通过 Cloudflare Pages / Workers 托管、GitHub 做版本管理。
合并前的两个独立站点:
| 原项目 | 内容 | 原地址 |
|---|---|---|
MYXZ-Blog-main |
VuePress 博客:博文、随笔、关于我 | blog.明裕.top |
Yu-Luo-Resume-master |
VuePress 个人简历页 | resume.明裕.top |
现在合并为单一站点、单次构建、单次部署:
- 首页:星空首屏 +「骆家有男,人称明裕」引言 + 快速入口
- 博文:前端 / 后端 / 安全 / 运维 / VPS / 简历技术栈 六个方向
- 随笔:生活记录
- 生活:追剧推荐、音乐推荐
- 简历:
/resume.html,整合了原简历页、原「关于我」页与《骆裕简历》PDF 的全部内容
- 原「关于我」页面已并入简历页:个人信息、网名、爱好(可点击跳转到生活栏目)、
以及原页面的「安利时刻」推荐板块,现在都在
/resume.html里。 - 原「关于我 → 追剧 / 音乐」两个栏目迁移到独立的 生活 栏目(
/life/追剧/、/life/音乐/)。 - 所属机构不再包含「淮安裕见新声信息科技有限公司」,现为 「南京盛网信息科技有限公司 / OnePanda安全团队」。
- 政治面貌统一为中共党员。
- 基本信息补充:网名、政治面貌、出生日期、求职意向、期望城市、联系电话
- AIGC 应用能力板块(原简历页没有)
- 项目经历新增:「网安 2026」「宁工铸盾」「蓝剑护网 2026」南京联合专项行动(2026.08,7 严重 3 中危)
- 教育经历补充非全日制/全日制标注与学习方向
- 自我评价补充 OnePanda 团队、技术学习小组等细节
mingyu-space/
├── docs/ # VuePress 源目录(构建入口)
│ ├── README.md # 首页(星空首屏)
│ ├── resume.md # 简历页(含原「关于我」内容)
│ ├── intro.md # 博客介绍页
│ ├── posts/ # 博文(六个技术方向)
│ ├── notes/ # 生活随笔
│ ├── life/ # 生活(追剧 / 音乐)
│ └── .vuepress/
│ ├── config.ts # 站点配置
│ ├── theme.ts # 主题配置(导航、博客、评论、图标)
│ ├── navbar.ts # 顶部导航
│ ├── sidebar.ts # 侧边栏
│ ├── client.ts # 客户端增强(挂载星场、注册组件)
│ ├── starfield.ts # Canvas 星场实现
│ ├── components/
│ │ ├── StarHome.vue # 首页首屏组件
│ │ └── ResumePage.vue # 简历页组件
│ ├── styles/
│ │ ├── palette.scss # 主题色
│ │ ├── config.scss # 布局尺寸
│ │ └── index.scss # 星空主题全局样式
│ └── public/ # 静态资源(随构建原样拷贝)
│ ├── _headers # Cloudflare Pages 响应头
│ ├── _redirects # Cloudflare Pages 重定向
│ ├── images/ # 个人风采照(已压缩)
│ └── ...
├── worker/
│ └── index.js # Cloudflare Worker(Static Assets + 旧链接跳转)
├── .github/workflows/
│ ├── ci.yml # PR / push 构建校验
│ └── deploy.yml # 部署到 Cloudflare Pages 与 Workers
├── wrangler.toml # Cloudflare 部署配置(Pages + Workers)
└── package.json
# 安装依赖
npm install
# 启动开发服务器(默认 http://localhost:8080)
npm run dev
# 生产构建,产物在 docs/.vuepress/dist
npm run build
# 清缓存构建(改了主题/样式配置后建议用这个)
npm run build:clean要求 Node.js 20 或更高(CI 固定用 22)。仓库内已包含 package-lock.json,
CI 使用 npm ci 保证依赖版本一致。
本项目锁定 vuepress-theme-hope@2.0.0-rc.74 与 vuepress@2.0.0-rc.20。
安装时必须使用仓库内的 package-lock.json:直接 npm install 若解析到过新的
@vuepress/helper(rc.134+)会因 API 移除导致构建报错
(does not provide an export named 'getRootLang')。如需升级依赖,请整组一起升级并重新构建验证。
A. Dashboard 连接 GitHub(最省事)
-
Cloudflare Dashboard → Workers & Pages → Create → Pages → Connect to Git
-
选择本仓库,构建设置填:
配置项 值 Framework preset NoneBuild command npm run buildBuild output directory docs/.vuepress/dist -
环境变量加一个
NODE_VERSION = 22 -
保存后每次 push 到
main会自动构建部署
B. 本地 wrangler 部署
npm run build
npx wrangler login # 首次需要登录
npm run cf:deploy # 等价于 wrangler pages deploy docs/.vuepress/distWorker 版本额外提供了旧链接 301 跳转与统一安全响应头:
npm run build
npm run cf:worker # 等价于 wrangler deploy(读仓库根目录 wrangler.toml)A. Dashboard 连接 GitHub(Workers Builds 自动部署)
Cloudflare Dashboard → Workers & Pages → Create → Workers → Connect to Git,构建设置填:
| 配置项 | 值 |
|---|---|
| Build command | npm run build |
| Deploy command | npx wrangler deploy(默认值,不用改) |
环境变量加 NODE_VERSION = 22。
⚠️ 注意:Workers Builds 默认的 Deploy command 就是npx wrangler deploy, 它只认仓库根目录的wrangler.toml,并且必须能从该文件解析出入口 (main或[assets])。构建时若报Missing entry-point to Worker script or to assets directory, 说明根配置里只有pages_build_output_dir(那是 Pages 专用字段), 需要像本仓库一样补上main与[assets]。 另外 Workers Builds 不读取wrangler.toml里的[build]段, 构建命令必须填在 Dashboard 上。
B. 本地 wrangler 部署
npm run build
npx wrangler login # 首次需要登录
npm run cf:worker # wrangler deploy,读根目录 wrangler.toml配置见根目录 wrangler.toml:
main=worker/index.js(旧链接 301、安全响应头、404 兜底)[assets]绑定到docs/.vuepress/distrun_worker_first = true— 让每个请求都先过 Worker。默认的「静态资源优先」 在命中已存在文件时会直接由边缘返回、完全跳过 Worker,于是 Worker 里 针对已有文件的规则(如/resume.html→/resume)和X-Site头都不生效not_found_handling = "404-page"— 未命中时返回站内样式化的 404 页
补充:
_headers/_redirects这两个文件在 Workers 静态资源下同样有效, 所以即便不开run_worker_first,基础安全头也不会丢; 它的作用是保证 Worker 代码里的规则成为唯一真源,避免两套规则各管一半。
.github/workflows/deploy.yml 已写好,在仓库 Settings → Secrets and variables → Actions
添加两个 Secret 即可:
| Secret | 说明 |
|---|---|
CLOUDFLARE_API_TOKEN |
Cloudflare API Token,需带 Cloudflare Pages:Edit 与 Workers Scripts:Edit 权限 |
CLOUDFLARE_ACCOUNT_ID |
Cloudflare 账户 ID(Dashboard 右侧栏可见) |
配置后:push 到 main 自动部署到 Pages;想去 Workers 时手动触发 workflow 并选 worker 或 both。
在 Cloudflare Dashboard 的 Pages/Workers 项目里 → Custom domains 绑定即可, 国内访问建议同时开启 DNS 代理(小黄云)。
| 想改什么 | 改哪里 |
|---|---|
| 站点标题、描述、语言 | docs/.vuepress/config.ts |
| 首页姓名、副标题、自我介绍、入口链接 | docs/README.md 的 <StarHome /> 属性 |
| 首页下方的正文段落 | docs/README.md 里组件之后的 markdown |
| 简历全部内容(基本信息、技能、工作、荣誉…) | docs/.vuepress/components/ResumePage.vue 顶部的数据数组 |
| 顶部导航 | docs/.vuepress/navbar.ts |
| 侧边栏 | docs/.vuepress/sidebar.ts |
| 主题色、卡片、导航、动效 | docs/.vuepress/styles/index.scss 与 palette.scss |
| 星场密度、颜色、流星 | docs/.vuepress/starfield.ts(DENSITY 常量与 draw()) |
| 社交链接、评论、图标 | docs/.vuepress/theme.ts |
| SEO / 站点地图 | 由 plugins 中的 seo、sitemap 自动生成 |
写文章:在 docs/posts/<分类>/ 新建 .md,frontmatter 里带 title、date、category、tag
即可被博客插件收录到归档、分类与时间线页。
对齐参考站 linverse.cn 的视觉语言,逐项落地:
| 设计要素 | 实现 |
|---|---|
深空底色 #0d0d0d |
--mg-bg,同时覆盖主题的 --vp-c-bg 系列变量 |
| 星云渐晕 | body::before 三层 radial-gradient,位置与参考站实测一致 |
| 纸感颗粒 | body::after 内联 SVG feTurbulence 噪点,透明度 0.03 |
| 动态星场 | starfield.ts Canvas:星点闪烁、缓慢上浮、偶发流星;prefers-reduced-motion 时退化为静态星点 |
| 衬线标题 | Noto Serif SC / Songti SC,字重 400,字距 0.04em 以上 |
| 柔紫强调 | #8b7bb8,用于链接、下划线、时间、徽标 |
| 极简导航 | 半透明毛玻璃 + 1px 发丝分割线,无阴影 |
| 内容留白 | 首屏居中、行距 1.9、卡片细边 |
| 动效节制 | 仅 fade-up 入场与卡片 hover 位移,尊重减弱动效偏好 |
- 个人风采照共 10 张,原图 37MB,已统一压缩到 1600px 长边、质量 82,总计约 1.33MB, 并剥离 EXIF(含 GPS 定位信息)。
favicon.ico生成为多尺寸 ICO,Apple Touch / PWA 图标由同一张图派生。- 图片全部置于
docs/.vuepress/public/,构建时原样拷贝,由 Cloudflare 边缘缓存分发。
简历 PDF 放在 docs/.vuepress/public/resume.pdf,构建后可通过 /resume.pdf 直接访问,
页面上有两个下载入口:简历页顶部(首屏可见)与页面底部。
需要注意:该 PDF 是公开可访问的,其中包含手机号、邮箱、QQ 号与出生日期等个人信息, 并且可能被搜索引擎收录。
若只想让它不被搜索引擎收录(链接仍然可用),在 docs/.vuepress/public/_headers 中
对应的 /resume.pdf 段落加一行即可:
/resume.pdf
X-Robots-Tag: noindex
Cache-Control: public, max-age=3600, must-revalidate
X-Robots-Tag 是专门用于 PDF、图片这类非 HTML 资源的标准响应头,比改 robots.txt 更精确。
(不要用 public/robots.txt 来做这件事:SEO 插件会读取该文件并追加一行空的
User-agent:* 段,与自定义规则冲突,结果不可靠。)
若要真正限制访问,则应改用 Cloudflare Access 之类的访问控制,而不是靠隐藏链接。
替换该文件即可更新简历,无需改代码;页面上标注的「4 页 · 480 KB」如与实际不符,
可在 ResumePage.vue 的 mg-download__meta 处同步修改。
MIT Licensed · 内容版权归骆裕(明裕)所有。