更新记录
-
-
- 站点顶栏配置从纵向长列表改成横向芯片:一级入口并排,分组和它的二级排在同一行里换行。
-
- 系统设置增加「站点顶栏」:拖拽调整 Stereo 顶栏一级顺序和显隐,工具 / 娱乐 / 文档的二级也在各自组内排序和显隐。
- 配置键 `client.site_nav`,经 `GET /web/settings` 的 `siteNav` 下发。没存过时按现在的默认顺序全部显示。
- 功能开关关掉的入口仍然不会出现;需要登录权限的二级入口仍按账号权限过滤。
-
- 传文件改为 2MB 分片:`/web/catbox/upload/init` 登记,`/chunk` 上传,`/complete` 立即返回任务。合并和 Catbox 代传仍在后台任务里。
- 整文件一次 POST 会在阿里云 CDN 默认 30 秒回源超时里被打成 504。单片也小于源站 Nginx 的 20MB 限制。
- 同一分片可重试覆盖;重复 complete 返回已创建的任务。超过 2 小时的临时文件会清理。
-
-
-
- 工作台访问详情和访问日志里,页面是 `/articles/:id` 时旁边有「预览」。点开气泡只看标题和概要。
-
- 未匹配路径(如 `/articles/`)改为站点 404:页头页脚、「这个页面不存在」和返回首页,不再用 Astro 默认错误页。
-
- 后台时间格式化遇到带 `Z` 或偏移量的 ISO 字符串时,原先把 UTC 钟面当成本地钟面。定时任务的开始/结束时间因此显示成 UTC。
- 这类绝对时间改为按浏览器时区显示;没有时区的 `YYYY-MM-DD HH:mm:ss` 仍按字面钟面显示。
-
- `web-hotlist-warmup` 种子脚本之前只有同步注释,定时任务秒退且退出码 0,Redis 没有写入预热热榜。补上与首页预热相同的调用,POST `/api/v1/client/web-hotlist/warmup`。
- 进程启动时若库里的脚本仍带该同步注释,会用这份种子覆盖。覆盖后的定时采集才会把 `updatedAt` 留在预热时刻。
-
- `/hotlist` 首次进入若 SSR 已带上 Redis 快照,直接用这份数据,不再显示「加载中」,也不再请求 `/hotlist.json`。
- 快照同时写在页面里的 `site-hotlist-initial`,岛屿没拿到 prop 时仍用它,卡片更新时间保持预热时刻。
-
-
-
- 片头片尾设置加「当前」:片头填入播放进度秒数,片尾填入离结尾还剩的秒数。播放器面板和页外弹窗都有。
-
- 播放器里的片头片尾面板改跟站点昼夜走,不再固定黑底白字。
-
- 修复影视控制条按钮不出现:DPlayer 把 `dplayer` 加在容器自身,原先 `querySelector` 找不到根节点,挂载被跳过。
-
- 影视播放器底部控制条增加上一集、下一集和片头片尾,浏览器全屏里可以直接切集、改片头片尾。
- 换集只更换 HLS,不再拆掉 DPlayer,避免全屏被退出。页头按钮、选集导航和片头片尾弹窗仍保留,两边保存走同一接口。
-
-
-
- `/privacy` 写明:X 推文、elitepvpers、GitHub issues 翻译默认关闭;用户打开后,当前页可见的他人正文才会发给 Google 翻译,关闭后立即停止。
- 同时写明 Discord 需点击才发送、划词/弹窗由用户发起,以及生词本向有道词典查询单词。
-
-
-
- `.env.terminal.local` 里的主机是组网 IP,拷到 Mac 上不能再 SSH 到这个地址。
- 解析时若该 IP 就是当前机器网卡,改连 `127.0.0.1`;开发机没有这块网卡则仍走组网 IP。
- 私钥路径仍必须是本机文件,不能沿用 Windows 路径。
-
- 生产终端连不上是因为 `TERMINAL_*` 只读启动时的环境 / `.env.terminal.local`,而该文件被 git 忽略,CI 每次发版又是新的 `releases/<sha>`,不会带上开发机那份,`TERMINAL_ENABLED` 保持关闭。
- 服务端改为从 cwd 和编译文件向上查找 `.env.terminal.local`;发布脚本若发现部署根有这份文件则拷进当前 release。
- 补 `.env.terminal.example` 与查找测试。Mac 上把文件放到部署根后需重启服务端。
-
- 蓝奏卡片左上角不再拉 Iconify 外链:外链失败后 onerror 又回落到同一源,会裂图并循环闪烁。
- 改成本地 Ionicons(文件夹 / 压缩包 / 文档 / 音视频),并在 SiteLayout 注册 archive-outline、document-outline、folder-outline。
-
- 简历访客页去掉按关键词抹字、以及「至今」工作项目整条隐藏;已发布内容先完整展示。
- 顶栏「在职中,故隐藏在职工作项目与描述」说明保留。
-
- 置顶 / 我的项目标题最多一行省略,只有点标题才进详情;标题 hover 加下划线,摘要和 meta 不再整卡可点。
- 最新文章标签改成更浅的 meta 色描边胶囊,hover 仍略提亮。
-
- 杂志「最新文章」标题 hover 时加下划线,颜色跟标题走,避免 overflow 把线裁掉。
-
- 发布框高度不再锁死:右下角可像 textarea 一样垂直拖拽,动态页默认 5.5rem、独立发布页默认 7.2rem,并设上限以免撑满信息流。
-
- 发布框字数从叠在正文上的绝对定位改成编辑区下方独立一行,长数字或换行文字不再挡住 `n / 1000`。
-
- 动态页发布框不再依赖后台并不存在的 write-post 选项;已登录(有会话 cookie)即露出「这一刻的想法…」,发表仍走本机 Client Key。
- 游客仍不显示发布框。
-
- 站点顶栏把「意见反馈 / 更新记录 / 关于我 / 简历」挪到「动态」后面,工具下拉仍在这四个文字入口之后。
-
- 杂志最新文章 PC 端把标签胶囊从左侧 meta 拆到行右侧,与阅读数一组;左侧只留分类 / 日期 / 时长,避免挤成一团或换行。
- 窄屏仍不显示标签。
-
- 去掉标签胶囊的上移位移,给 meta 行留出上下空隙,避免 overflow 把胶囊顶部削掉。
-
- 杂志最新文章标签胶囊与分类 / 日期同一中线对齐,并略微上移,避免看起来偏下。
-
- 杂志最新文章 PC 标签改成 frost 描边小胶囊(#名),不再跟分类 / 日期挤成同一段纯文字;窄屏仍不显示标签。
-
- 杂志「最新文章」PC 端把标签接到分类 / 日期 / 阅读时长同一行,超出省略;窄屏仍只显示原来的 meta。
-
- 杂志首页置顶 / 专题在窄屏(≤720)只露出第一条,其余仍走「查看更多」;桌面一行 3 条不变。
-
- 杂志首页置顶 / 专题(含「我的项目」)预览从一行 2 条改成一行 3 条,窄屏仍单列。
-
-
-
- 简历左侧树原先只给「模块」做了拖拽,工作/个人项目、教育、工作经验、技能条目是静态列表,所以看起来不能排序。
- 组内条目补上拖拽手柄,松手后写回 `contentJson` 对应 `items` 顺序;工作项目与个人项目互不串组。
- 预览纸张与右侧表单跟同一份顺序,保存后生效。
-
- 右侧「项目内容 / 工作内容」多行框原先只绑了 `:model-value`,Arco Textarea 每次输入都会把字打回原文,所以看起来完全改不了。
- 改为本地草稿 + `@update:model-value` 回写,输入中不覆盖正在编辑的那一条。
-
- 简历设计器中间纸张改为可直接点选改字:物料字段走 `ResumeInlineText`,改完同步右侧数据面板。
- 模块拖拽改为左侧手柄,避免点文字就被 Sortable 抢走;缩放改用 `zoom`,避免 `transform:scale` 下光标点不准。
- 右侧表单 deep watch 在内容相同的时候不再整份替换,避免输入法被打断。设计器关闭 keepAlive,避免带着旧稿进另一份简历。
-
- 杂志列表在 PC 上也和窄屏一样:标题、摘要都只显示一行,超出省略号。
-
- 杂志缩略图和宫格封面加载失败 / 裂图时,隐藏破损 img,用昼夜双主题灰色占位底替代,避免白框或浏览器裂图图标。
- 加载更多插入的新行同样会扫一遍已失败封面。
-
- 移动端顶栏「动态」改成与搜索条同高的发丝线胶囊,右侧加小箭头,看起来是可点入口而不是普通文字。
-
- 杂志列表窄屏缩略图不再写死 68px 高,改为贴齐左侧标题 / 摘要 / meta 的总高度,封面等比裁切铺满。
-
- 杂志文章 meta 改成左右排布:分类 / 日期 / 阅读时长靠左,阅读量靠右,填掉原先挤在左边、右边空一大片的空白。
- 眼睛图标改成固定 13px 方盒并做光学下移,与中文 meta 文字对齐。
- `_magazine.scss` 超 500 行,把置顶 / 专题样式拆到 `_magazine-pick.scss`。
-
- 杂志首页文章行、加载更多拼出的行,以及置顶 / 专题条目,补上与宫格卡片一致的阅读量(眼睛图标 + 次数)。
-
-
-
- 公开页 `/privacy` 上线 formant 扩展隐私政策,供 Edge 商店隐私政策 URL 打开。
- 页脚增加「隐私政策」入口,站点地图收录 `/privacy`。
-
-
-
- 杂志列表在窄屏(≤640)上,文章标题和摘要都只显示一行,超出省略。
-
- 杂志置顶 / 专题去掉圆角外框,栏目标题改成打断一条发丝线的刊头,正文贴齐栏宽。
-
- 杂志「最新文章」的分类 / 标签从标题旁两排铺开,改成两个开关:平时只显示当前项,点开后在浮层里列出全部。
- 两组互斥,同一时间只展开一个;窄屏也保留这两个开关,不再整段藏掉。
-
- 敏感文章 / 敏感动态遮罩上的两层雪花噪点改为错帧跳动,提示胶囊保持静止。
- 系统开启「减少动态效果」时雪花停止动画。
-
- 杂志首页刷新闪一下再变矮:摘要单行截断、两列网格和默认标题边距原先等 Vite CSS 到了才套上。
- 把锁高度的规则内联进 head(`SiteMagazineFirstPaintStyles`),摘要改 `nowrap` + 省略号,缩略图补宽高,首屏就按收紧后的高度排。
-
- 置顶 / 专题恢复一圈细外框,仍不加标题横线和列间竖线。
-
- 杂志置顶 / 专题去掉外框、标题分隔线和列间竖线,只靠留白分开。
- 窄屏(≤768)隐藏最新文章旁的分类 / 标签筛选,避免文字被裁成碎片。
-
- 杂志首页置顶 / 专题块收紧高度:标题做成细栏,摘要改单行,块间距与内边距下调,避免两块框占太多首屏。
-
- 杂志「最新文章」标题右侧补回标签筛选,与分类上下两排。
- 分类、标签都恢复「全部」,并加上全部分类 / 全部标签索引入口。
-
- `GET /web/articles` 支持 `pinned=1`:只返回当前有效置顶,写入 `list` / `total`,供站点置顶完整列表页使用。
- 未带该参数时首页置顶预览仍最多 5 篇,缓存键不变。
- 新增 `web-list-query.validator.test.ts` 覆盖 `pinned=1`。
-
- 杂志首页置顶与专题区块右上角增加「查看更多」,分别进入 `/pinned` 与 `/collections/:id` 完整列表。
- 完整列表复用杂志行(左文右缩略图),返回链走 `.site-back`。
- 置顶完整列表走 `GET /web/articles?pinned=1`,不再受首页置顶预览条数限制。
-
- 杂志首页置顶与精选改为图 1 的两列纯文本块,上下排列,不再用横向卡片轨。
- 分类筛选贴在「最新文章」标题右侧,样式对齐原标签横排;去掉「全部」项和「全部标签 / 全部分类」入口。
- 杂志首页不再渲染顶部 Hero 标签条。
-
- 新增客户端配置 `client.homepage.style`(经典宫格 / 杂志列表,默认经典),放在后台「设置 → 客户端设置 → 博客筛选条」。
- `GET /web/settings` 下发 `homepageStyle`;非法值回落 `classic`;缓存键改为 `settings-v6`。
- 新增 `web-client-settings-homepage-style.test.ts` 覆盖缺省、杂志与非法值。
-
- 博客首页新增杂志列表风格:`GET /web/settings` 的 `homepageStyle` 为 `magazine` 时,最新文章改为左文右缩略图,分类筛选移到标题右侧,并隐藏原 Hero 分类行。
- 杂志分页展示「已显示 n / total」、加载更多文章、第 N 页(`/?page=`)与全部文章档;`hasMore` 仍按本页是否满页判断。经典宫格为默认,行为不变。
- 新增 `SiteBlogMagazine` / `SiteBlogMagazineRow` 与 `_magazine.scss`,加载更多按风格追加对应 HTML。
-
- 站点字体改为 WOFF2:`src/assets/fonts/MiSansVF.woff2`(约 11.9MB,原 TTF 约 19.2MB),`misans-face.css` 由 Vite 打进 `/_astro/*.woff2`,走现成的 30 天 immutable 缓存,避免每次打开都回源拉整份字体、标签一直转圈。
- `@font-face` 从 `_tokens.scss` 的 `/fonts/misans/MiSansVF.ttf` 挪到 `misans-face.css`;源 TTF 仍留在 `public/fonts/misans/`,换源后跑 `node scripts/compress-misans-woff2.mjs`。
- `DEPLOY.md` 源站 Nginx 增补 `location ^~ /fonts/` 长缓存,避免旧地址再落到 `location /` 的 `no-cache`。
-
- 排查爱壹帆带 `cf_clearance` 仍 403:`m10.iyf.tv` 与 `www.iyf.tv` 均被 Cloudflare 挑战,只有搜索域名 `rankv21.iyf.tv` 放行;本机出口 IP 每新建一条连接就换一个(直连与代理端口都如此),而 `cf_clearance` 绑定出口 IP,所以与浏览器过验证时的 IP 对不上。
- Impit 换 User-Agent 后仍会带 Chrome 124 / macOS 的 `Sec-CH-UA`,与用户 UA 自相矛盾。iyf 请求现在按用户 UA 派生 `Sec-CH-UA` / `-Mobile` / `-Platform`(仅 Chrome / Edge)。
- `fetchTvOutbound` 返回补充 `cfMitigated`(`cf-mitigated` 响应头);iyf 403 错误区分「被 Cloudflare 挑战」与其它拒绝,文案提示出口 IP 不一致。新增相关测试,server typecheck 通过。
-
- 影视爱壹帆:`www.iyf.tv` 被 Cloudflare 托管挑战拦截,服务端自行请求会 403。`/web/tv/source/search|episodes|play` 新增可选请求头 `x-tv-iyf-clearance` / `x-tv-iyf-user-agent`,由用户在浏览器过验证后携带 `cf_clearance` 与对应 UA。
- 新增 `tv-source/tv-source-request.ts`:解析并校验请求头(非法值忽略,防注入);`TvPlaybackSource` 三个方法增加可选 `options` 参数,kanju 忽略。
- iyf 服务只对 `*.iyf.tv` 域名附加 `Cookie` / `User-Agent`;`web-tv-outbound-http` 新增 `impitOnly`(浏览器 TLS 指纹,代理与直连都试,某条出口 403 则换下一条)。带 cookie 仍 403 时错误提示 cookie 失效或与出口 IP / UA 不一致。cookie 不落库、不写日志。
- CORS 允许头补充上述两个请求头。新增 `tv-source-request.test.ts`(5 条);server typecheck 通过。README 影视条目补充该请求头说明。
-
- 修复 iPhone(iOS 17.1+,hls.js 走 ManagedMediaSource)看剧 AI 播放一直转圈:`prepareVideoForCast` 把 hls.js 已置为 `true` 的 `disableRemotePlayback` 又改回 `false`,导致 MMS 不 `sourceopen`。现在只在 `true` 基础上叠加,不再改回;`cast-handoff.test.ts` 补充该用例。
- 影视爱壹帆被 Cloudflare 挑战拦截(403)时,播放页错误区与取流提示处新增 `TvIyfClearanceForm`:填写 `cf_clearance`(可选 UA,默认当前浏览器)后保存并自动重试;存于本地 `localStorage`,可清除。
- 新增 `lib/tv/iyf-clearance.ts` 管理存取与格式校验;`lib/tv/client.ts` 仅对 iyf 的搜索 / 集数 / 取流请求附加 `x-tv-iyf-clearance`、`x-tv-iyf-user-agent` 请求头,其它片源不发送。typecheck 通过。
-
- 音乐播放器存储分层:队列、当前曲、进度、是否在播、是否已激活、迷你播放器停靠位置改存 `sessionStorage`,关闭浏览器后重置;播放模式(列表循环等)单独存 `localStorage`(`aphelios:music-play-mode:v1`)。
- 新增 `lib/music/player-storage.ts` 统一存取;首次加载时从旧 `localStorage` 播放状态里只迁出播放模式,其余旧键清除。
- `float-dock.ts` 与 `MusicFloatBar.astro` 内联脚本的停靠位置读写改用 `sessionStorage`,并清除旧的 `localStorage` 值。
- 退出登录清理播放历史时一并清除播放模式。
-
- 简历相关脚本改为按路径懒加载:`mountResumeFrame` 从 `SiteLayout` 全局脚本移到 `/resume` 页面脚本,仅在简历页加载。
- 删除 `resume-utility-floats`:悬浮层显隐已由 `SiteLayout` 在 SSR 阶段通过 `site-skin--no-*` 类决定,客户端重复计算多余。
- 移除 `SiteLayout` 全局 `<head>` 里对简历预览的 `preconnect` / `prefetch`,`/resume` 页自身 head 仍保留;站内悬停预取策略不变。
- 新增 `lib/auth/auth-bounce.ts` 承载登录回弹标记读写与 `clearAuthNavigationBounce`;`site-header.ts` 改引它,`resume-auth-navigation` / `resume-auth-decision` 只在 `/login`、`/signup` 加载。
-
-
-
- 终端已开启却因配置问题保持关闭时,`GET /terminal/status` 多返回 `problem`(只含变量名与固定说明,不含任何取值),终端页直接显示原因,不再只提示「未启用」。
- 启动时增加校验:`TERMINAL_SSH_KEY_PATH` 指向的私钥文件必须存在,否则终端保持关闭并写日志;说明环境变量只在服务端启动时读取,改完需重启。
- 终端测试里临时生成的 ed25519 密钥改为生成后自检、不合格重来(`ssh2` 自带生成器约每 300 把会产出自己解析不了的密钥,导致测试偶发失败);只影响测试,不影响运行时。
-
- 新增后台浏览器终端:server 新模块 `terminal`(`ws` upgrade + `ssh2`),`/api/v1/terminal/ws` 首条消息带后台 access token 认证,通过后以私钥 SSH 到服务端配置的唯一目标主机;页面不能填主机、用户或命令。开发机连 Mac 的组网地址,Mac 上部署的 server 连 `127.0.0.1`,同一套代码靠环境变量区分。
- 配置只走环境变量:`TERMINAL_ENABLED`(默认关)、`TERMINAL_SSH_HOST/PORT/USER/KEY_PATH/KEY_PASSPHRASE/HOST_KEY_SHA256/TERM`、`TERMINAL_IDLE_TIMEOUT_MS`、`TERMINAL_MAX_SESSIONS`。取值放在被忽略的 `.env.terminal.local`(模板 `.env.terminal.example`);`.env` / `.env.mac` 已入库,不放这些值,所以没有按原计划改 `ecosystem.mac.config.cjs`(PM2 环境变量会盖住本地文件)。非回环主机必须配 host key 指纹,缺配置时终端保持关闭并打日志。
- 安全边界:专用权限 `terminal:use`,演示账号拒绝;同一账号单会话(新连接顶替旧连接)、全局并发上限、空闲超时、每 60 秒复核登录态,失效即断开;输出积压时暂停读取;操作日志只记「打开/关闭」,不记键盘输入与终端输出。不新增错误码,错误复用 `UnauthorizedError` / `ForbiddenError`。
- Admin 新增 `/system/terminal`(`TerminalView` + `TerminalConsole`,xterm.js,`terminal-client` / `terminal-session` 拆在 `lib/`);需点「连接」才会建立会话;新增 `xterm-vendor` 分包。未启用或无权限时给出提示。
- 权限树模板加入 `terminal:use`;增量 SQL `scripts/migrations/20261012-terminal-permission.sql`(权限、`/system` 下菜单、`menu_permissions`、仅 `super_admin` 的 `role_permissions`,幂等,需在现网手动执行一次)。仓库里没有 `scripts/mysql-init.sql`,所以只提供增量 SQL。
- Dashboard 评估:终端是运维入口,没有待办或统计可挂,快捷入口组件只服务内容跳转,所以不加 widget,入口只在侧边栏菜单。
- `DEVOPS.md` 的 nginx 示例加 `location = /api/v1/terminal/ws`(Upgrade + 长超时);`README.md` 增加终端说明;新增模块 README。
- 新增依赖:server `ws`、`ssh2`(及类型),admin `@xterm/xterm`、`@xterm/addon-fit`。测试:新增 16 条,覆盖配置、host key 指纹、协议、注册表、真实 ssh2 本地服务端到端、WebSocket 连接状态机、upgrade 路由;server / admin typecheck 通过。
-
-
-
- 修复 iOS(含 iOS 上所有浏览器,均为 WebKit)分享海报中间配图区空白:WebKit 光栅化 SVG foreignObject 时首次导出不等内部图片解码。
- 新增 `renderPosterPng`:WebKit 下先预热渲染一次再取第二次结果,超时放宽到 24 秒;其它内核行为不变。
-
-
-
- 纯文字海报占位星体按中间区实际宽高重绘,不再把固定画布拉扁。
-
- 动态分享海报导出前按卡片剩余高度写死中间图区,多图也铺满,避免 html-to-image 算不出 flex 留下白边。
-
- 动态分享海报单图需要裁剪时从画面中心放大,不再从顶部切。
-
- 动态分享海报单图按内容收高度,图和页脚之间不再空出大块打点留白。
-
- 动态分享海报长文按字数截断后拼「...」,不再靠 CSS 省略。
-
- 纯文字动态分享海报中间用文章同款太空星体画作占位,有图时不显示。
-
- 动态分享海报单图按原比例放下,不再拉高去填剩余高度;多出来的空间留在图和页脚之间。
-
- 分享海报「扫码阅读原文」下方补上弱化原文链接。
-
- 动态分享海报不再限 3 张图。上面是头像和名字,中间图文吃满剩余高度,少留白。1 张铺满,2 张或 4 张两列,其余三列。
-
- 动态分享海报头像改成和页头一样的品牌头像。
-
- 动态分享海报改成信息流卡片:头像、名称、时间和正文。去掉便签、图钉和话题标签。
-
- 动态分享海报单图改为完整放下,不再放大裁切。
-
- 动态信息流的文字和图文可以分享海报,视频不分享。能看私密动态的账号才能用。
- 海报最多 3 张图:1 张铺满,2 张或 3 张各占三分之一。图片走同域代理,生成前先拉成本地,避免海报丢图。
- 分享样式挂在站点布局上,软跳转后不会丢。
-
- 编辑框字号改直接写在输入框上。旧的跨页样式不再盖住新字号。
-
- 私密记事本编辑框字号继续缩小。
-
- 私密记事本编辑框字号再调小一档。
-
- 私密记事本编辑框字号改小。
-
- 私密记事本样式改成写进布局 head,软跳转后会再挂一次,不再被卸掉。
-
- 私密记事本只改正文,标题不能改。取消和保存放在编辑框下面。
- 编辑区和预览不再撑破卡片。编辑样式挂在站点皮肤上,软跳转后不会丢。
-
- 客户端可 `POST /web/vault/notes/update` 修改自己的私密笔记标题和正文。图片与文件引用若和原文不一致会拒绝。每分钟 20 次。
-
- 私密记事本展开后可以改标题和正文。保存只接受文字改动,正文里的图片和文件链接必须和原来一致。
-
- 新增 Telegram 入口 `POST /api/t`。同一 `@oolaf` bot 继续处理 `/start login_…` 深链登录,并分发频道或私聊命令。
- `/generate-img` 与 `/generate-img 关键词` 用已有 Unsplash key 取图,`sendPhoto` 回同一聊天。失败时在聊天里回一句原因。
- `telegram:webhook` 改为登记 `https://<origin>/api/t`,`allowed_updates` 增加 `channel_post`。旧 deep-link webhook 转发到同一入口。本地用 `telegram:ingress:dev` 向 `127.0.0.1:3101/api/t` 提交伪造频道消息,不改生产 webhook。
-
- 已登录但访问 `/music` 会在登录页和音乐页之间一直跳。页头认的是本机会话,需要登录的页面只看 Cookie `aphelios.at`;Cookie 过期或没写上时,登录页发现已登录又跳回去。现在每次打开页面都会用本机会话把这枚 Cookie 补上,再回跳。若仍然跳回登录页,就停在登录表单并提示重新登录,不再转圈。
- 音乐页确认权限失败时留在当前页并提示稍后重试,不再把已登录用户送回登录页。
-
-
-
- 歌词文件名横线左边固定为歌名。`Mojito-周杰伦`、`Always Online-林俊杰`、`Letting Go-蔡健雅` 按英文歌名去查,不再对调成歌手名。
- 标题里的 `(feat. …)` 会拆成歌手。`稻香 (Live)` 搜索时去掉 Live。歌词缓存键改为 `music:lyrics:v3`。
-
- 横线左边一律当歌名。`Mojito-周杰伦`、`Always Online-林俊杰`、`Letting Go-蔡健雅`、`稻香 (Live)-周杰伦` 不再把英文歌名当成歌手。
- `星光的背後 (feat. 白白 & 黎安珂)` 会拆出歌名和 feat 歌手。上次查空的结果不再沿用。
-
- 中文歌词文件名按「歌名 - 歌手」拆。短歌名配较长的乐队名不再对调。`安和桥 - 宋冬野`、`春风十里-鹿先森乐队` 按歌名在横线左边去查。
- 酷狗占位文案「酷狗音乐 就是歌多」不当成歌词。歌词缓存键改为 `music:lyrics:v2`,不再沿用之前拆错的结果。
-
- 中文文件名按「歌名 - 歌手」拆开。`安和桥 - 宋冬野`、`春风十里-鹿先森乐队`、`猜不透 说唱版 -卢卢快闭嘴 刘思达` 都是歌名在前。英文歌手在前的 `Beyond - 海阔天空` 仍按歌手在前。
- 正在播放把歌词记在本页会话里。切回已经听过的歌直接显示,不再请求歌词接口。
-
- 歌词 query 在歌名、歌手都传入时也会校正对调。`爱我就跟我走 - 王鹤铮`、`爱我就跟我走-王鹤铮` 和 title/artist 写反的请求,都按歌名「爱我就跟我走」、歌手「王鹤铮」去查。
-
- 歌词查询统一走 `parseLyricQuery`:文件名里的横线(含全角、长短横线)和已经拆开但歌名、歌手对调的 query,都会收成歌名加歌手再请求。`爱我就跟我走 - 王鹤铮` 与 `爱我就跟我走-王鹤铮` 都按歌名「爱我就跟我走」、歌手「王鹤铮」查。
-
- 正在播放海报的五线谱改成谱号图形,线条调浅。二维码固定在右下角,不再跟在歌名旁边。
-
- 正在播放分享海报的底图从星球星空改成唱片音符和五线谱,黑夜白天都用品红和海军蓝。二维码下方写明「扫码打开 oolaf」。
-
- `遇见-孙燕姿` 这类不带空格的「歌名-歌手」会拆开再查。没有时间轴的纯文本歌词也会返回,不再因为缺少 `[mm:ss]` 被丢掉。
-
- 分享海报不再把整份字体嵌进图片。生产环境生成时不会一直停在加载;超过 12 秒会提示失败。
- iPhone / iPad 不再把播放接到音频分析器上,切到后台时歌可以继续播。后台期间的系统暂停不会被记成用户暂停。
- `遇见-孙燕姿` 会拆成歌名和歌手。没有时间轴的歌词按纯文本显示,不跟着进度跳行。
-
-
-
- 正在播放页主区域改成视口高度,并清掉软跳转留在节点上的高度。从别的页面点进来时歌词不再塌成内容高度。
-
- 正在播放歌词区改为撑满歌名和进度条之间的剩余高度,不再固定成一小段后把空白留在下面。加载时这块区域同样占满,转圈居中。
-
- 正在播放页顺序改为唱片、歌名、歌词,进度条贴在播放按钮上方。歌词区固定高度,加载时不再被内容撑开或塌掉。
-
- 正在播放页收紧唱片、标题和上下间距,歌词区变矮。声波从进度条上方的长条改成绕在唱片外圈的短线。
- 歌词请求过程中显示转圈,不出现「加载中」文案。
-
- 歌词文件名 `歌名(说唱版)-歌手` 这种不带空格的横线会拆成歌名和歌手,搜索先用去掉括号的 `踏浪说唱版`。括号内外的同一歌名可以匹配上。
-
- 正在播放按文件名查歌词时,`踏浪(说唱版)-管小天 肖小丽` 会拆成歌名和歌手,不再把整段文件名当成标题。
-
- 正在播放页不再重复打 `me`、`recent.json` 和歌词接口:权限已在本地时不再补拉 `me`;最近常访在非首页只上报一次访问,不拉列表;同一页的二次挂载不再重放。歌词等音频时长到了再查一次。
-
- 顶栏标志改成样式里的内嵌图,页面不再请求 `oolaf-avatar.png`。
-
- 顶栏站点标志在软跳转前移出被换掉的顶栏,新页面里的那张去掉地址。进正在播放不会再请求 `oolaf-avatar.png`。
-
- 音乐入口增加 `GET /web/music/lyrics`:按歌名、可选歌手和时长向酷狗、网易云查 LRC。翻唱、未填歌手、同名歌会换条件再查,对不上则返回空歌词。
- 命中缓存 24 小时,未命中短缓存。需已登录且开通音乐入口。
-
- `/music/now` 在进度条下按歌名显示滚动歌词,当前行高亮,点一行跳到对应时间。没有歌词时显示「暂无歌词」。
- 文件名按「歌手 - 歌名」拆开再请求歌词;音频时长已知且和歌词末轴差很多时会再查一次,用来区分同名歌。
-
- 音乐浮条的当前曲目、播放进度和「已经点播过」改存本机 localStorage。关掉浏览器再打开,停靠位置、曲子和进度还在。
-
- 站点字体收成一份完整 `MiSans VF`(约 2.9 万字形,字重轴 150–700)。去掉 HarmonyOS 与 Noto Serif SC,正文、阅读和大标题都走这一套,默认字重 330。
-
- 正在播放分享海报右下角增加站点二维码,内容为公开地址 `https://www.oolaf.top`。
-
- 正在播放分享一点就「海报已复制」:根节点的复制模式属性和复制按钮重名,任意点击都会命中复制。模式改成独立属性,只有「复制图片」才复制。
- 音乐海报改用文章详情同一张 banner 画布,卡片仍是 840×280,文案叠在左侧。
-
- 正在播放分享海报去掉专辑名和站点名,只留「最近在听」和歌名。
-
- `/music/now` 分享按钮补上弹层和海报卡片样式;按钮去掉浏览器默认边框,与播放控件同一套圆形按钮。
-
- `astro check` 的 async 提示:访问打点、CMS 缓存、绘图/幻灯片 IndexedDB、预览缩放和翻译分路改为 `async`/`await`。
- 未登录跳转与 `/search`、`/legacy` 兼容跳转先算出目标再 `return`,避免顶层 `return` 被 TypeScript 当成未使用引用。
-
-
-
- 分享海报样式加 banner 布局时漏掉 `@media (max-width: 767px)` 开头,残留未配对 `}`,Vite/Sass 构建失败;已补回窄屏规则。
-
- `/music/now` 与专辑动态段同层,软跳会把 `now` 当成专辑并回落到正在播的「全部音乐」;专辑改到 `/music/album/{id}`,`now` 只渲染正在播放。
-
- 当前歌详情走专辑页:浮条专辑名、播放页歌名/专辑名/返回都进 `/music/{albumId}#曲目`,列表滚到正在听的那首。
-
- 专辑动态页兼渲正在播放会让 `/music/*` 整段 500;正在播放只保留 `now.astro`。浮条封面/曲名仍链到并 `navigate` 进 `/music/now`。
-
- 浮条封面/曲名点击用 ClientRouter 进 `/music/now`;动态专辑路由若抢到 `now` 也直接渲染正在播放页,不再当专辑。
-
- 专辑 rest 路由会把 `/music/now` 当成专辑并踢回曲库,浮条点进播放页无效;改回单段 `[albumId]`,封面/曲名做成真正链到 `/music/now`。
-
- 专辑详情按 id 对不上就会「未找到」但播放器仍在唱:按标题/`all-music`/当前曲目回落查找,路径型 id 改 rest 路由;英雄区 `[hidden]` 不再被 grid 盖掉。
-
- `/music/now` 控件旁增加「最近在听」横条分享海报:有 `music` 即显示,不走文章 `share-poster` 权限;无二维码;可复制/保存昼夜图。
-
- site 无衬线改自托管 `MiSans VF`(`/fonts/misans/MiSansVF.ttf`);`--site-font-sans` / `--site-font-reading` 走该字体,缺字仍回落 HarmonyOS。
-
- `/music/now` 声波图软跳后会按 canvas 默认 300×150 或 View Transition 残留宽高拉伸;换页清掉内联尺寸并按布局重算 backing store,与刷新一致。
-
- 声波图画布在闭包里收窄 canvas / 2d 上下文类型,离开页面时断开 ResizeObserver。
-
- `/music/now` 在封面下增加实时声波条:跟播放内核 Analyser 音量走,暂停回落;标签色用 `--site-fg`。
-
- 曲库专辑卡片与专辑详情封面改为静态唱片机 SVG,轴心仍用原渐变缩写;不旋转、唱臂落下。
-
- ClientRouter 软跳后按本地停靠偏好重写浮条 `data-dock`,并清掉 View Transition 残留定位,避免 left / right / bottom 样式丢到刷新才恢复。
-
- 正在播放时把 `document.title` 改成 `曲名 - 专辑`,标签页可直接看到当前曲目;暂停或停播后恢复该页原标题。
-
- `/music/now` 封面改为同一套唱片机 SVG:播放时碟片旋转、唱臂落下,专辑图缩在轴心。
-
- 浮条 left / bottom / right / hide 收成一组玻璃圆钮,始终可见;当前停靠用 accent 填色,隐藏改为关闭图标。
-
- 侧停靠改用精简唱片机 SVG:碟片 grooved platter 播放时旋转,唱臂落下;封面缩在轴心;暂停唱臂抬起、碟片停转。
-
- 侧停靠去掉假唱片纹、厚饼图进度和重阴影:改成小圆封面 + 发丝进度环;悬停只出玻璃播放键。
-
- 软跳前把 `site-music-engine` 挪到 `html` 下再换回 persist 槽,避开 ClientRouter 重建 audio 导致回首页停播。
- 浮条不再 persist;显示时去掉 `hidden` 并用 `.is-visible { display:grid !important }`,避免进页模板把播放条藏掉。
-
- 浮条 `transition:persist` 改回 `site-music-float`,不再换 persist 名,避免 ClientRouter 软跳时把旁边的 `site-music-engine` 音频内核一起换掉。
- 播放器优先继续用还在文档里的那颗 audio;window 监听与 subscribe 只绑一次,避免回首页后实例丢失、无法续播。
-
- 音乐浮条隐藏不再 `translateY(110%)` 推出视口:`html/body` 的 `overflow-x: clip` 会连纵轴一起裁切,进场后仍只剩底边一条。改为原地透明度显隐。
-
- 音乐浮条进场改回直接写 `transform`(不再只改 CSS 变量),避免浏览器不重算位移,播放条卡在视口外只露出一条边。
-
- `/music-library.json` 拉曲库改用长超时(与图库/网盘同类),避免 CMS 默认 3 秒掐断列出 S3 对象,页面报 aborted due to timeout。
-
- 全站音乐浮条桌面可停靠:默认底中;悬停露出左右小箭头切到侧边圆形唱片,唱片上可切回底部;偏好存本地。
- 窄屏仍为底栏,不提供停靠;侧停时机器人 / 最近常访不再为底栏上抬。
-
- `/vault` 记事本列表卡片右侧补更新时间,格式 `mm/dd hh:mm`(本地时区),标题与箭头之间用 muted 字号展示。
-
- 登录页 Linux.do 入口改为指定德国旗圆形 SVG(灰底、黑/白/金三色条),尺寸仍由 `.site-auth__provider svg` 的 26px 控制。
-
- 接入 Linux.do Connect OAuth 登录:`LinuxdoOAuthAuthService` / client / utils 走 start、callback、complete 与 Redis 一次性挑战;identity 落 `client_identities.provider=linuxdo`,新用户 username 前缀 `l.`。
- 新增 `/web/auth/linuxdo/start|callback|complete`、错误码 `40118-40121` 及对应 AppError;`/web/settings` 下发 `linuxdoLoginEnabled`,settings 缓存键升到 `settings-v5`。
- 后台 SSO 登录方式多选增加 Linux.do;预埋 `LINUXDO_CLIENT_ID` / `LINUXDO_CLIENT_SECRET` / `LINUXDO_REDIRECT_URI`,三项未齐时入口与接口保持关闭。
-
- 登录页新增 Linux.do Connect 纯图标入口,与其它 SSO 同为 42px 圆形细边框横排;走现有 OAuth start、弹窗、轮询 complete。
- CMS settings 与 auth 类型补齐 `linuxdoLoginEnabled`;mono 三项 Linux.do env 未齐或后台关闭时不渲染入口。
-
- 接入 Google OAuth 登录:`GoogleOAuthAuthService` / client / utils 走与 GitHub 相同的 start、callback、complete 与 Redis 一次性挑战;identity 落 `client_identities.provider=google`,新用户 username 前缀 `o.`。
- 新增 `/web/auth/google/start|callback|complete`、错误码 `40114-40117` 及对应 AppError;`/web/settings` 下发 `googleLoginEnabled`(总开关 + provider 开关 + 三项 env),settings 缓存键升到 `settings-v4`。
- 后台 SSO 登录方式多选增加 Google;三项 env 未齐时入口与接口保持关闭。
-
- 登录页新增 Google OAuth 纯图标入口,与 Telegram / Discord / GitHub 同为 42px 圆形细边框横排;走现有 OAuth start、弹窗、轮询 complete,成功后共用 session 与 `next` 回跳。
- CMS settings 与 auth 类型补齐 `googleLoginEnabled`;mono 三项 Google env 未齐或后台关闭时不渲染入口。
-
- 预埋站点 Google SSO env:`GOOGLE_CLIENT_ID`、`GOOGLE_CLIENT_SECRET`、`GOOGLE_REDIRECT_URI` 写入服务端 env schema;`.env` 开发回调、`.env.mac` 生产回调已占位,Client ID/Secret 留空即关闭。登录流程、后台开关与站点入口尚未接入。
-
确认评论邮箱
邀请制评论