Koncert Together 是一个面向中文用户的 K-pop 巡演与观演信息站。当前阶段采用 GitHub Pages 作为公开前台,用结构化静态数据承载艺人页、巡演日历、活动详情、场馆指南和 fandom 内容,再由本地主机低频自动更新内容并触发发布。
公开站点:https://suidge.github.io/koncert-together/
项目不是泛资讯站,也不是一开始就做重社区后台,而是先把最常用、最容易影响观演决策的信息做扎实:
- 真实可浏览的巡演日历
- 重点艺人的成员资料与活动集合页
- 可执行的城市与场馆指南
- 可信的官方来源自动同步
- 适合试运行阶段的低运维静态发布方式
当前版本的核心目标是:
- 给小范围真实用户提供可持续使用的 K-pop 观演信息入口
- 用尽可能低的维护复杂度跑出稳定更新的内容站
- 保留未来迁移回全栈架构的扩展空间
当前站点包含这些公开模块:
- 首页:内容入口、重点艺人、重点场次、巡演雷达、指南和社区精选
- 巡演日历:按艺人、地区、状态筛选活动与巡演消息
- 活动详情:时间、场馆、购票入口、出行提示、来源核对
- 艺人主页:成员档案、已官宣场次、巡演消息、相关指南、最近官方动态
- 指南中心:购票、出行、城市和场馆资料页
- 社区精选:静态精选内容与投稿入口
- 图片署名页:对外部图片来源做统一说明
- 内部状态页:不在公开导航中显示,用于运维侧检查来源状态
当前公开站点采用静态导出方案,核心技术栈如下:
Next.js 16App RouterReact 19TypeScriptpnpmGitHub PagesJSON结构化内容文件Node.js本地同步脚本
关键配置:
- 静态导出:
next.config.ts中启用output: "export" - Pages 子路径:通过
NEXT_PUBLIC_BASE_PATH=/koncert-together - 图片策略:全部走本地静态资源,不依赖
next/image优化服务 - 发布方式:GitHub Actions 构建
out/目录并发布到 Pages
项目当前以 data/ 目录下的结构化文件为中心:
data/artists.json- 艺人资料、成员、官方入口、宣传图信息
data/events.json- 活动卡片、状态、票务入口、场馆、提示、来源、活动图
data/tour-plans.json- 尚未落到具体日期的巡演雷达
data/guides.json- 购票、城市、场馆、fandom 指南
data/venue-guides.json- 场馆指南源数据,由脚本合并进
guides.json
- 场馆指南源数据,由脚本合并进
data/community.json- 社区精选内容
data/source-registry.json- 已跟踪的官方来源列表
data/source-status.json- 来源可达性与最近检查结果
data/image-sources.json- 官方艺人图片来源登记表
data/event-image-sources.json- 官方活动海报来源登记表
data/official-update-sources.json- 官方动态同步源登记表
data/official-updates.json- 最近同步到的官方动态结果
data/site-meta.json- 构建时间、计数、来源健康摘要
页面入口放在 app/:
app/page.tsx- 首页
app/calendar/page.tsx- 巡演日历
app/artists/page.tsx- 艺人目录
app/artists/[slug]/page.tsx- 艺人详情页
app/events/[slug]/page.tsx- 活动详情页
app/guides/page.tsx- 指南列表页
app/guides/[slug]/page.tsx- 指南详情页
app/community/page.tsx- 社区精选页
app/credits/page.tsx- 图片署名页
app/ops/status/page.tsx- 内部状态页
lib/site-data.ts- 统一定义站内数据类型和静态数据导出
lib/events.ts- 页面读取活动、艺人、巡演消息的访问层
lib/assets.ts- Pages 子路径下的资源路径处理
components/*- 卡片、头部、页脚、筛选器、交互组件
当前图片策略刻意分层:
- 艺人页:优先使用官方艺人宣传图
- 活动页:优先使用活动专属官方海报
- 其余情况:回退到站内生成海报,保证一致性和可维护性
当前同步脚本:
scripts/sync-approved-images.mjs- 同步官方艺人图并更新艺人页数据
scripts/sync-official-event-images.mjs- 同步官方活动海报并更新活动页数据
scripts/redesign-generated-visuals.mjs- 生成 fallback 艺人与活动海报
当前项目已经不是纯手工更新,而是“结构化数据 + 少量官方同步”的模式。
脚本:scripts/sync-source-health.mjs
作用:
- 对已登记的官方艺人页、票务页、场馆页做低频探测
- 记录
status / checkedAt / finalUrl / contentType / etag / lastModified - 输出到
data/source-status.json - 将
401/403这种受限页面标成restricted
命令:
pnpm sync:sources脚本:scripts/sync-approved-images.mjs
作用:
- 从已登记的官方站点抓取艺人主视觉
- 下载到本地
public/media/artists/ - 回写
artists.json - 如配置允许,也可影响活动图逻辑
命令:
pnpm sync:images脚本:scripts/sync-official-event-images.mjs
作用:
- 从活动海报登记表抓取活动专属官方海报
- 下载到本地
public/media/events/ - 回写
events.json
命令:
pnpm sync:event-images脚本:scripts/sync-official-updates.mjs
作用:
- 从少量官方页面同步最近一条动态
- 目前主要用于艺人页展示“最近值得注意的官方更新”
- 当前以少量 JYPE 官方站为起点
命令:
pnpm sync:official-updates脚本:scripts/sync-venue-guides.mjs
作用:
- 读取
data/venue-guides.json - 合并到
data/guides.json - 保持指南列表统一输出
命令:
pnpm sync:venue-guides脚本:scripts/refresh-editorial.mjs
作用:
- 重写一部分艺人介绍、成员 profile、活动提示、巡演消息文案
- 让结构化数据保持统一的站点口吻
命令:
pnpm refresh:editorial脚本:scripts/prepare-pages-data.mjs
作用:
- 检查 slug 和 URL
- 排序数据
- 校验来源映射
- 更新
site-meta.json
命令:
pnpm prepare:pages安装依赖:
pnpm install本地开发:
pnpm dev默认访问:
pnpm sync:sources
pnpm sync:official-updates
pnpm sync:images
pnpm sync:event-images
pnpm sync:venue-guides
pnpm refresh:editorial
pnpm redesign:visuals
pnpm prepare:pages
pnpm typecheck
NEXT_PUBLIC_BASE_PATH=/koncert-together NEXT_PUBLIC_SITE_URL=https://suidge.github.io/koncert-together pnpm build工作流文件:.github/workflows/deploy-pages.yml
当前行为:
- 触发条件:推送到
main - 构建环境:
Node.js 22+pnpm 10 - 构建步骤:
- 安装依赖
- 运行
scripts/prepare-pages-data.mjs - 运行
pnpm build - 上传
out/并部署到 Pages
项目托管在 GitHub Pages 子路径下:
- 站点地址:
https://suidge.github.io/koncert-together/ NEXT_PUBLIC_BASE_PATH=/koncert-together
因此:
- 所有静态资源必须通过
assetPath()处理 - 不要手写根路径资源 URL
这部分按“试运行阶段长期维护”来写。
日常运维的目标不是服务器维护,而是这四件事:
- 官方来源仍然可达
- 图片和海报仍然能正常更新
- 指南与活动数据没有被结构破坏
- GitHub Pages 发布链路正常
每天或每次批量更新前,按这个顺序:
- 同步来源状态
- 同步官方动态
- 同步官方图片与活动海报
- 同步场馆指南
- 刷新文案与 fallback 视觉
- 运行数据整理
- 运行类型检查
- 运行构建
- 如果有变化则提交推送
- 检查 GitHub Pages 工作流是否成功
本地主机或长期在线机器可以直接每天执行:
cd /Users/neoshi/kpop-events
pnpm refresh:pages这个脚本会依次执行:
git checkout maingit pull --ff-only origin mainpnpm install --frozen-lockfilepnpm sync:sourcespnpm sync:official-updatespnpm sync:imagespnpm sync:event-imagespnpm sync:venue-guidespnpm refresh:editorialpnpm redesign:visualspnpm prepare:pagespnpm build- 有内容变化时自动
commit + push
脚本文件:scripts/run-pages-refresh.sh
推荐每天一次,足够适合当前试运行模式:
17 6 * * * cd /Users/neoshi/kpop-events && /bin/bash -lc 'pnpm refresh:pages >> /Users/neoshi/kpop-events/.logs/pages-refresh.log 2>&1'建议额外准备:
.logs/目录- 非交互式 Git 凭证
- 失败通知方式,例如邮件、Telegram 或其他推送
gh run list --workflow='Deploy Pages' --limit 5git status --shortcat data/source-status.jsoncat data/official-updates.jsonnode - <<'NODE'
const events=require('./data/events.json');
console.log(events.find(e=>e.slug==='itzy-manila-2026'));
NODE按这个顺序排查:
git status是否真的有改动提交git push是否成功gh run list --workflow='Deploy Pages'是否成功- 浏览器是否缓存旧资源,强刷后再看
按这个顺序排查:
- 检查
public/media/里资源是否存在 - 检查
out/media/是否被正确导出 - 检查
data/artists.json/data/events.json中图片路径是否正确 - 检查 SVG 是否有无效属性
- 检查线上资源返回码:
curl -I https://suidge.github.io/koncert-together/media/events/example.svg优先看:
- 官方站是否更换 HTML 结构
- 是否被临时限流或 TLS 异常
fetch的来源解析规则是否失效
排查方式:
pnpm sync:official-updates
pnpm sync:images
pnpm sync:event-images逐个单跑,不要一上来先怀疑构建。
优先检查:
data/venue-guides.json是否字段缺失data/guides.json是否被非预期覆盖app/guides/[slug]/page.tsx是否仍支持practical字段
- 来源可达性探测
- 官方动态低频同步
- 官方图片与海报同步
- 结构化数据校验
- fallback 海报重生成
- 静态构建与 Pages 发布
当前方向非常明确:
重点是把公开前台做成稳定可用的内容站:
- 扩艺人覆盖
- 扩活动覆盖
- 扩场馆/城市指南密度
- 扩官方图与官方海报覆盖
- 扩少量真实来源自动同步
在不放弃静态托管优势的前提下,继续做这三件事:
- 提高官方来源自动更新比例
- 把重点场馆指南做成真正可规划的资料页
- 提高活动页“专属海报”覆盖,而不是复用艺人宣传图
如果未来不再受限于 GitHub Pages,项目会重新回到全栈方向:
- 用户系统
- 跨设备收藏
- 评论/发帖
- 提醒系统
- 真正的数据后台
- 数据库驱动的社区功能
仓库当前仍保留部分 Prisma 依赖,就是为了后续可以平滑迁回数据库架构,而不是从零重做。
当前优先级建议如下:
- 优化站点图片质量。扩更多高质量的艺人图和活动海报,尝试自动抓取高质量fan club二次分发图。同时一定要避免重复使用图片,图片主题需要与页面场景匹配。
- 把场馆指南继续深化,增加更细的站口、区域、酒店与地图入口。
- 扩更多官方动态同步源。
- 提高重点艺人的活动覆盖度。
- 尽可能保证全自动更新维护。
- 在试运行确认有真实用户价值后,再决定是否迁回全栈架构
最后保留一条维护原则,后续改这个仓库时尽量不要偏离:
- 前台公开内容优先稳和可信
- 自动化优先做低风险、可复核的同步
- 活动数据宁可慢一点,也不要把风声写成官宣
- 图片宁可少,也不要用不清晰或不可追溯的来源
- 指南内容要以“能帮助用户做决定”为标准,而不是只堆概念说明