更新记录
-
-
- 修复 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 留空即关闭。登录流程、后台开关与站点入口尚未接入。
-
-
-
- 爱壹帆 catalog/取流改走与看剧同一套 `fetchTvOutbound`(production 先系统 TLS 直连)。不再单独 Impit+继承 `HTTPS_PROXY`,避免 Mac 上 rustls `tls handshake eof`。
-
- HLS 出站流加上 error 监听,分片不再用 20s `AbortSignal.timeout` 打断整段下载;代理 Agent 等流结束后再 close。避免超时变成 Readable 未处理 error 把 Node 打挂,历史/visits 随即 ECONNREFUSED。
-
- 看剧取流按 catalog `key` / token / 截断的旧 `av_` id 对齐集数;网关 URL 不再当成已可播 m3u8,仍走 `/v1/playback/resolve`。避免续看 key 对不上现网 id 时 dev/prod 都报「未找到可播放的 HLS 地址」。
-
- 影视播放页续看 `episodeKey` 不在当前集数列表时改播第一集,避免旧看剧 id(`episode:yj:` / 截断 `av_`)对不上现网集数,整页报「未找到可播放的 HLS 地址」。
-
- 看剧 JSON 出站不再先 `Readable.fromWeb(body)` 再 `text()`,避免 undici「Body has already been read」把搜索打成 502。
-
- 看剧/HLS 出站改为 production 先直连(IPv4、4s 建连),代理只探针 2.5s;catalog 不再套 `WEB_HLS_PROXY_URL`。HLS 清单/分片不再只用 Impit+继承代理,避免 Mac 上搜索慢、播放器一直 0:00。
- 同 videoId 集数列表缓存 15s,播放页 episodes+play 少打一轮 catalog。
-
- 看剧出站:production 不再继承桌面 Clash 的 `HTTPS_PROXY`(只认 `CLASS_PROXY_URL` / `WEB_HLS_PROXY_URL`);`fetch failed` 与 cause 链视为可重试,代理 TLS SYSCALL 后改直连;502 文案带上 cause。
-
- 看剧 catalog/episodes 现网 `urls` 为空,播放改走 `GET /v1/playback/resolve/{token}` 读 `line_options` 里的 https m3u8;取流后把 CDN host 学进 HLS 白名单,清单代理才能放行。
-
- 看剧取流不再要求 `yjm3u8` 必须带 `.m3u8`:认 baipiaozhe 网关(可无后缀)、`urls` 对象/数组,以及只有 `episode:yj:` 时补网关地址,避免集数在、地址被滤掉后报「未找到可播放的 HLS 地址」。
-
- 播放/续看把 `episodeId`、`bootstrapEpisodeId`、`episodeKey` 上限从 64 提到 128,与看剧长 id 对齐;`client_tv_play_history.episode_key` 同步加宽(增量 SQL `scripts/migrations/20260920-tv-history-episode-key-128.sql`)。
-
- 看剧AI 目录搜索与 yjm3u8 解析不再只用 Impit+HTTP 代理做 TLS:先走 undici(系统 TLS)经同一条 `CLASS_PROXY_URL`,握手失败再直连 / Impit,避免 Clash 上 rustls `tls handshake eof` 连 HTTP 状态都到不了。
-
-
-
- 「显示更新记录入口」排到「入口与功能」里「显示文章入口」正下方,分区内按白名单顺序展示。
-
- 后台「设置 → 客户端设置 → 入口与功能」补上「显示更新记录入口」开关(`client.updates.enabled`),不再只落在未列出的「其他」分区。
-
- `telegram:webhook` 对 Telegram API 连接/登记失败改为只打错误日志、正常退出;Mac 发布流水线同样忽略该步失败,避免健康检查已通过后因 TLS 握手失败导致 CI 变红。
-
- `/updates` 只按年月日折叠:每个日期默认露出 3 个时刻,时刻块全量展示;展开/收起改成描边胶囊按钮。
-
- `/updates` 收起改到展开内容末尾(下一日期之前),不再和「展开」共用顶部位置。
-
- `/updates` 展开/收起始终放在当前区域文本下方;收起改为「收起其余 N 条」并提高对比,避免和下一时刻挤在同一行。
-
- `/updates` 样式挂到 `html.site-skin` 下,避免日期 `h2`、时刻 `p` 的 margin 被站点全局标题重置盖掉。
-
- `/updates` 加大日期到时刻块、以及相邻时刻块之间的空隙;收紧同一时刻内条目行距。
-
- `/updates` 收紧日期标题与时刻行、时刻行与首条内容的间距,避免标题和副标题脱开。
-
- `/updates` 每个自然日默认只露出 3 个时刻,其余折叠;单个时刻超过 3 条仍可再展开。
- 删除未接入 yarn 的字体子集工具:`subset-site-fonts.mjs`、`build-font-charset.py`、`scripts/font-src`。
-
- `AGENTS.md` 增加硬性约束:`LOGS.md` / `logs/` 禁止写入密钥、口令、Token、私钥、`.env` 取值等敏感信息;环境变量只记名字不记值。
-
- `AGENTS.md` 增加硬性约束:`LOGS.md` / `logs/` 禁止写入密钥、口令、Token、私钥、`.env` 取值等敏感信息;环境变量只记名字不记值。
-
- 新增 `GET /web/updates`:部署时从本仓库与 stereo 分支 `LOGS.md` / `logs` 生成 `apps/server/static/site-updates.json`(gitignore,不入库),按日分页下发;`updatesEnabled` 关闭则 403。
- mono deploy 二次 checkout `stereo` 后 `yarn generate:updates`,产物打进发布包。
-
- `/updates` 改为请求 mono `GET /web/updates`,去掉本仓库静态 JSON 与 `generate:updates`。
- 页改成按日时间轴,去掉导语;每个时刻最多露出 3 条,其余展开/收起。
-
- 后台「设置 → 客户端设置」新增 `client.updates.enabled`(显示更新记录入口),默认开启;`/web/settings` 下发 `updatesEnabled`,关闭后 Stereo `/updates` 与入口隐藏。
- 升级 settings 缓存键到 `settings-v3`,避免旧缓存缺少新开关。
-
- 新增公开 `/updates` 按日时间轴:聚合本仓库与 mono 的 `LOGS.md` / `logs` 归档,静态写入 `src/data/site-updates.json`,不进数据库;`yarn generate:updates` 可重生成。
- 顶栏、抽屉、页脚增加「更新记录」入口;`updatesEnabled` 关闭则入口隐藏且页面跳走。先展示 14 天,点击「加载更多」再拉后续日。
-
- mono Mac mini 发布流水线执行 Telegram `setWebhook` 前显式导出本机代理 `CLASS_PROXY_URL=http://127.0.0.1:7890`,确保独立部署 Shell 不依赖 PM2 子进程环境也能访问 Telegram API。
-
- `SiteLayout` 仅在博客首页与文章详情实际渲染 `SiteRobotFloat`;其他站点页面不再挂载机器人脚本,也不会无意义请求 `/web/robot/status`。
-
- 后台客户端设置的 SSO 分区收拢为一个组合配置项:仅保留 SSO 总开关与 Telegram、Discord、GitHub 登录方式多选,不再为四个布尔配置分别展示卡片。
- 设置分组滚出可视区域后,顶部操作区继续显示「重置全部 / 保存全部」,并同步标明当前选中的设置 Tab 名称。
-
- 后台「设置 → 客户端设置」新增「SSO 登录」分区:提供 `client.sso.enabled` 总开关,以及 Telegram、Discord、GitHub 三个 provider 独立开关;默认全部开启以保持现有行为,密钥与回调地址仍由 env 管理。
- `/web/settings` 将后台总开关、provider 开关与 env 完整性合并为最终可用状态,并升级 settings cache key 避免旧缓存把新增开关误判为关闭;关闭入口后对应 start/callback/complete、Telegram Widget 与 webhook 登录链路同步拒绝,不只隐藏前端图标。配置保存会沿用现有 web cache 清理立即生效。
- 将超过 500 行的 `config-definition.ts` 按核心、客户端、内容源、服务、安全、Formant 与元数据拆分为模块化定义文件,保持原配置顺序、默认值和导出不变;`ConfigGroupCard` 继续使用 Arco switch 并按职责展示新分区。
-
- 客户端 settings 类型补齐 `ssoLoginEnabled`;Telegram、Discord、GitHub 最终入口状态由 mono 后台 SSO 总开关、provider 独立开关和 env 完整性共同决定;`/login` 改为每次 SSR 直取 settings、不复用 60 秒进程缓存,后台保存后刷新登录页即可立即显隐。
-
- 新增 GitHub OAuth App 纯 SSO:`start`、`callback`、`complete` 使用 `read:user` 获取 GitHub id/login/name/avatar,服务端兑换 token 且不落库;首次登录以 `github` identity 自动注册 `g.` + 4~6 位随机字母账号,与 Telegram/Discord 账号保持独立。
- Discord 与 GitHub 共用新抽取的 `OAuthChallengeStore` 和 OAuth callback validator/HTML:Redis state、浏览器 verifier、approved/failed 状态及重放防护统一原子处理,Discord 既有行为保持不变;GitHub 补齐配置、失效、过期、上游失败错误码与派生类。
- `.env` 与 `.env.mac` 预埋 GitHub Client ID/Secret/Redirect URI,开发回调指向 localhost、生产指向 `www.oolaf.top`;三项完整才由 `/web/settings` 实时开启 `githubLoginEnabled`,无需数据库迁移或增量 SQL。
-
- 登录页新增 GitHub OAuth App 纯图标入口,使用指定 GitHub 内联 SVG 并以 `currentColor` 适配昼夜主题;与 Telegram、Discord 保持 42px 圆形细边框横排,无常驻文字。
- Discord/GitHub 前端 start、complete、popup、轮询收敛为 provider 参数化流程,Telegram 深链与 Widget 备用保持独立;挂载逻辑从 `SiteSsoProviders.astro` 拆至 `site-sso-providers.ts`,避免后续 provider 扩展触碰 500 行上限。
- `/login`、CMS settings 与 auth 类型补齐 `githubLoginEnabled`,mono 三项 GitHub env 未完整配置时安全隐藏入口;授权成功继续复用现有 session 存储、`me()` 与 `next` 回跳。
-
- Discord 登录入口由 Ionicons 改为指定的品牌蓝圆底白色 Discord 内联 SVG,并移除不再使用的 `logo-discord` 全局注册;按钮尺寸、细边框及与 Telegram 的横排布局不变。
-
- 新增 Discord OAuth2 纯 SSO:`start` 创建 3 分钟 Redis state/verifier 挑战,`callback` 服务端兑换授权码并读取 `identify` 用户资料,`complete` 原子消费结果并签发本站会话;Discord token 不落库。
- `WebClientSsoService` 改为 provider 通用签发,Telegram 行为保持不变;Discord identity 复用 `client_identities`,首次注册生成 `d.` + 4~6 位随机字母账号,与 Telegram 身份按策略分别建立独立站内账号,无需新增表或 SQL。
- `.env` / `.env.mac` 预埋 `DISCORD_CLIENT_ID`、`DISCORD_CLIENT_SECRET`、`DISCORD_REDIRECT_URI`;三项完整才由 `/web/settings` 开启 Discord 入口,SSO env 字段在通用 settings 缓存外实时覆盖,避免部署后读取旧开关。新增 Discord 配置、失效、过期及上游失败错误码与派生类,并补 OAuth URL、资料归一化和回调地址校验测试。
-
- 登录页新增 Discord OAuth2 圆形 `logo-discord` Ionicon,与 Telegram 保持同尺寸纯图标横排;仅 mono 三项 Discord env 完整时渲染,不增加常驻 provider 文字。
- 第三方登录从 `SiteLoginPanel` 拆为 `SiteSsoProviders`,统一管理 Telegram 深链、Widget 备用及 Discord OAuth 弹窗/轮询,成功后共用本站 session 存储与 `next` 回跳;状态、拒绝、超时及弹窗阻止提示仅在交互后出现。
- auth client、CMS settings 类型与默认值补齐 Discord start/complete 和 `discordLoginEnabled`;`SiteLayout` 注册 `logo-discord`,样式继续复用昼夜主题 token。
-
- mono Mac mini 发布流水线在服务健康检查通过后自动幂等执行 Telegram `setWebhook`,固定恢复到 `https://www.oolaf.top`;首次上线及本地 ngrok 调试后的生产切回均无需人工运行命令。
-
- 登录页第三方 provider 区保持纯圆形图标横排,Telegram「改用网页授权」不再常驻图标下方,仅在深链等待、过期或失败时提供临时备用操作,后续追加 Discord 等 provider 不会形成“图标 + 文字”纵向入口。
-
- Telegram 登录新增 Bot 深链主流程:`POST /web/auth/telegram/deep-link/start` 生成浏览器 verifier 与独立 `/start` token,Redis 保存 3 分钟一次性挑战;Telegram webhook 确认后,浏览器轮询 `complete` 并复用既有 identity 自动注册与 session issuer。
- 新增 `POST /web/auth/telegram/deep-link/webhook`,通过由 bot token 派生的 `X-Telegram-Bot-Api-Secret-Token` 做 timing-safe 校验;start token 与 approved challenge 均用 Redis Lua 原子消费,避免重放、并发重复签发及 Bot 侧 token 直接兑换浏览器会话。
- 新增 `telegram:webhook -- <HTTPS origin>` 命令配置 Telegram `setWebhook`,支持项目出站代理;Telegram 深链解析、webhook secret 与 profile 归一化新增 5 个单测,原 Widget HMAC 登录保留为备用。
-
- Telegram 品牌入口改为真实 42px 圆形 `<button>` + 内联指定 SVG,修复 Ionicons 自定义 SVG 不显示和透明 iframe 点击不稳定;点击后创建 3 分钟深链挑战、打开 Telegram App,并每 1.5 秒轮询确认,成功后复用现有 session 存储与 `next` 回跳。
- 官方 Login Widget 改为「改用网页授权」备用入口,按需加载,不再覆盖品牌按钮;providers 仍为可换行横排容器,后续可追加其它 SSO。
- `npm run telegram:tunnel` 同时打印 mono webhook 配置命令;Astro 开发代理将同一 ngrok 域名的 `/api` 转发到本机 mono,便于 Telegram webhook 本地联调。
-
- Telegram 圆形登录入口改用指定蓝色渐变品牌 SVG,并通过 Ionicons `addIcons` 注册为 `logo-telegram` 后由 `ion-icon` 渲染;按钮尺寸、边框和官方 Widget 点击覆盖层保持不变。
-
- Telegram 登录入口由官方大号文字按钮改为 42px 圆形 `send-outline` 纸飞机 Ionicon 细边框按钮(Ionicons 8 无 Telegram 品牌图标);官方跨域 Widget iframe 透明覆盖点击区,继续使用原生授权弹窗与验签链路。第三方入口改用可换行 providers 容器,后续可并排追加 Google/GitHub。
-
- 新增独立命令 `npm run telegram:tunnel`:确认 3102 dev server 后启动 ngrok,自动清除仅子进程内的代理变量以兼容免费套餐,并打印公网 `/login`、Domain 和 BotFather `/setdomain` 提示;`Ctrl+C` 只关闭隧道,不影响 `npm run dev`。Vite 开发服务器允许 `.ngrok-free.app` Host,避免随机隧道域名被 403 拒绝;旧终端尚未刷新 PATH 时,Windows 自动回退到本机 ngrok 安装路径,并将 spawn 失败转成明确错误提示。
-
- 站点客户端接入 Telegram SSO 登录:新增 `POST /web/auth/telegram`(HMAC-SHA256 验签 + `auth_date` 防重放 + IP 限流),首次登录自动注册(username 为 `t.` + 4~6 位随机字母,唯一冲突重试;昵称取 Telegram first_name + last_name),会话签发与密码登录共用新抽取的 `WebClientSessionIssuer`(`web-client-session-issuer.ts`),`WebClientAuthService` 行为不变。
- 新增 Prisma `ClientIdentity`(`client_identities` 表,`provider` + `provider_user_id` 唯一,`client_user_id` 外键级联删除),为后续 Google/GitHub 预留;现网需手动执行一次增量 SQL(CI 不跑 migrate)。
- env 新增 `TELEGRAM_BOT_TOKEN` / `TELEGRAM_BOT_USERNAME`(`.env` 与 `.env.mac` 已预埋空值,空 = 功能关闭);`/web/settings` 新增下发 `telegramLoginEnabled` / `telegramBotUsername`。
- 错误码新增 `TelegramAuthInvalid 40103` / `TelegramAuthExpired 40104` / `TelegramLoginNotConfigured 40105`,并在 `app-error.ts` 同步派生类;验签器 `telegram-auth-verifier.ts` 配 7 个单测(合法/缺省/篡改/错 token/坏 hash/过期/未来时间戳)。
-
- 登录页接入 Telegram SSO:`/login` SSR 经 `getCachedClientSettings` 取 `telegramBotUsername`,未配置或接口失败时不渲染入口(安全降级,页面其余部分不受影响)。
- `SiteLoginPanel` 表单下新增「或」分隔线 + 官方 Login Widget(动态注入 script,`data-onauth` 全局回调 → `webClientAuth.loginWithTelegram` → `me()` → 跳 `next`),接入现有 `astro:page-load` 挂载/防重复逻辑;`_login.scss` 新增分隔线与容器样式,只用 `--site-*` token,昼夜自适应。
- `src/lib/auth` 新增 `loginWithTelegram` 与 `WebClientTelegramAuthPayload` 类型,会话存储与密码登录同一链路;`WebClientSettings` 类型与 `defaultClientSettings` 同步 `telegramLoginEnabled` / `telegramBotUsername` 字段。
-
-
-
- 文章编辑器链接弹层不能切换站内/外链、输入框也打不了字:弹层 `@mousedown.prevent` 把 radio 和 input 的默认行为一起拦住了。表单控件放行,确定/移除仍阻止失焦。
-
- 列表封面按场景改写:Unsplash 用 `w=640&fm=webp`,`s0.oolaf.top` 拼七牛 `imageView2`;详情 hero 用更大一档;OG 图仍原地址。
- HarmonyOS 改为 GB2312 一级子集 woff2 并 preload;去掉 Google Fonts,自托管一份 Noto Serif SC Regular 子集作展示衬线。
-
- `SiteLayout` 默认 robots 从 `noindex,nofollow` 改成 `index,follow`,博客/文章等公开页不再被整站屏蔽收录;登录、注册和文章 404 仍 noindex。
-
- 文章富文本链接支持「站内路径 / 外链」:选中文字后可选 `/test` 这类站内地址,不再被补成 `https://`;站内同页打开,外链仍新窗口。
-
- 文章正文链接改用 `--site-fg-muted`,hover 用 `--site-fg-bright`,昼夜都和普通正文区分开;`href="/test"` 仍按站点 origin 打开。
-
- 文章编辑「正文」标题行和工具栏之间补 12px 间距,全屏按钮不再贴着编辑器。
-
- 文章状态拆成上架 / 下架 / 草稿三态:列表下架写入 `unpublished` 不再当草稿;筛选、抽屉、专题列表同步展示。
-
- 文章列表「状态」「更新时间」收进标题列:状态跟置顶标签同行,更新时间跟摘要同行,去掉独立列省宽度。
-
- 文章编辑/新增抽屉在「正文」标题加网页全屏与收起,仅正文覆盖页面并可滚动,Esc 退出。
- 文章管理置顶 Tab 支持拖拽排序和列表内优先级编辑,与抽屉置顶优先级同步;新增 `POST /articles/pin-sort`。
-
- 部署后 PM2 起不来:`import { clsx } from "clsx"` 打到 Excalidraw 提升上来的 CJS `clsx@1.1.1`。强制解析到 `clsx@2.1.1`(有具名 ESM 导出),SSR 也把 clsx 打进服务端包。
-
- `/tv` 播放器进度条和设置 switch 不再跟黑核糊在一起:控件改用封面叠字的浅色 token(`--site-hero-ink-on-dark`),白天主题也不再吃成 `--site-accent` 的黑。
-
- stereo 部署 CI 在 Mac 上 `yarn install` 失败:`postinstall` 要跑 `scripts/copy-excalidraw-fonts.mjs`,发布 tarball 只打了 dist / package.json 等,没带 `scripts/`。打包步骤补上该目录。
-
-
-
- 文章正文相框去掉灰垫,改成贴页面底的细发丝框,padding 收到 3px;简历头像同样去掉发灰底。
-
- `/articles/:id` 正文图加相框:frost 发丝边 + 垫边,和周围阅读面分开;小图仍不拉满,点击仍看原图。
-
- `/draw` 进页报 `_jsxDEV is not a function`:React 19.3 的 jsx-dev-runtime 在 Vite 预打包后 `jsxDEV` 为空。改为 shim 到 `jsx`,并关掉 Oxc 开发态 JSX。
-
- 今日热榜按小时强制预热:`POST /client/web-hotlist/warmup`(client-key)重采已启用平台写入 Redis;定时任务 `web-hotlist-warmup` cron `0 * * * *`,脚本 Key 复用首页预热的 `WEB_CACHE_WARMUP_CLIENT_KEY`。增量 SQL `scripts/migrations/20260916-web-hotlist-warmup-scheduled-job.sql`。
-
- `/hotlist` 进页改为 SSR 带上 Redis 快照,有数据就不再先转圈再打 `/hotlist.json`;冷缓存仍由客户端补拉。
-
- `/slides/:id` 顶栏改成单行:标题与放映/保存/删除垂直居中,「已保存」挪到标题和按钮之间,不再垫在标题下面。
- `/slides/:id/play` 返回、标题、全屏同一行垂直对齐;全屏旁标出快捷键 F。
-
- `/slides` 切页预览闪一下源码框:iframe 重载时 remark 的 `#source` 会露出来。切页改为后台加载新 iframe,旧页留着,就绪后再换;源码 textarea 默认隐藏。
-
- `/slides` 放映钉图底部被裁:正方形图按宽度放大后高出剩余画布。改为按剩余高度等比缩小(`--pin-frac`),完整显示、不再被 overflow 切掉。
-
- `/slides` 首次进编辑页、从放映返回后预览钉图消失:overlay 量不到尺寸时不再写成 0×0,先铺满预览框;量到后再信箱对齐。ClientRouter 回来会强制重挂 iframe 并重画钉图。
-
- `/slides` 编辑预览钉图和放映页大小不一致:两边都按 16:9(1280×720)信箱缩放,overlay 不再铺满整块预览框,left/top/width 百分比和放映共用同一块画布。
-
- `/slides` 放映裂图:去掉 srcdoc 里把 img 改成 data-src 的做法,钉图继续用真实 src。
- 编辑页首次预览没图:钉图解析放宽,CDN 地址立刻挂到 overlay,iframe 改为垫底绝对定位,load 后再画一次钉图。
-
- `/slides` 插入图片不再送进 remark:编辑预览把钉图叠在 iframe 上,原图在 Worker 里缩成 960 预览图;remark 只渲染去掉 pin 的 Markdown,主线程不再解码相机原图。
-
- Oolaf 面试备忘 30 秒改成先讲核心:start 立刻返回任务 ID,传到 Catbox 放后台,前端轮询 success 才拿链接。超时/转圈挪到追问。
-
- `/slides/:id` 编辑顶栏去掉层间横线和插入区分隔线,只留标题/页选择输入发丝底边。
-
- `/slides` 插入图片卡死:根因是预览把原图像素送进 remark,且 presenter 会复制成三份解码;预览改为最长边 960 的缩小图,srcdoc 里先 data-src、去掉 notes/preview 克隆后再给当前页挂 src。
-
- Oolaf 面试备忘改成口播:大文件不能一个请求干等;先 start 拿任务 ID,再轮询好了没。追问覆盖为什么拆两步、轮询什么、进度条、为何不直传。
-
- 「何健-前端开发-西安」个人项目 Oolaf 绑下架面试备忘 `interview-oolaf-catbox-chunk`:Catbox 大文件切片上传(官方无分片口、中台落盘异步代传、手写 multipart)。口播结构与海外官网等篇一致。
- 简历列表预览关掉再开,面试便签会丢:`$refs` 被 computed 缓存成已销毁 DOM。改为每次打开重取宿主,分页就绪后再画浮层。
-
- `/slides/:id` 编辑顶栏分层:名称与放映/保存/删除、翻页与插入、套用模板拆成三层,发丝线分隔;快捷说明收到按钮 title,不再挤在同一行。
-
- `/slides` 插入图片改为先写入 IndexedDB,预览用本地草稿;点保存(含 Ctrl+S)才上传 gallery OSS 并写回 CDN 地址。
-
- 新增 `POST /web/slides/:id/images`:需 slides 权限,图片落到当前 gallery 绑定的 OSS,转 WebP 最长边 1920;Web API 调试文档已补。
-
- `/slides` 支持插入图片:传到当前生效的 gallery OSS,预览里可拖动位置、右下角缩放;也可粘贴或拖放图片。
-
- `/slides` 去掉插入流程图:编辑页分类轨、拖入/点击插入和相关脚本样式都移除,流程图仍只在 `/draw`。
-
- 流程图上传 WebP 最长边限制 1920,避免原图像素过大把站点幻灯片预览卡死。
-
- `/slides` 插入流程图不再卡死:预览 iframe 关掉 remark 的 `transform:scale` 和 window resize 循环,预览图先缩到最长边 1280 再送进 remark;素材条缩略图改为懒加载。
-
- `/draw` 找回「在画布上查找」侧栏:去掉素材库时不再从 DOM 拆侧栏节点;查找输入框补发丝边,素材库页签和右上角入口仍隐藏。
-
- `/slides` 插入流程图后预览不再卡死:remark iframe 限制图片尺寸并关掉溢出滚动条循环缩放;流程图导出也限制最长边 1920。
-
- `/draw` 界面去掉 Excalidraw 文案痕迹(Mermaid 弹层说明、更多工具标题、导出水印、帮助里的 Plus/协作宣传);本地保存改用流程图 .json,不再用 Excalidraw 作文件类型名。
-
- `/draw` 去掉 Excalidraw 素材库:右上角入口、侧栏、命令面板和右键「添加到素材库」都不再出现;画布查找仍可用。
-
- `/draw` 去掉「线框图至代码」(选中画框上的 AI 转换、更多工具里的入口),文字至图表 / Mermaid 仍保留。
-
- `/draw` 把 Excalidraw 主题覆盖改到其 CSS 之后加载,清掉黑夜模式残留紫色(主色、表面、焦点边框、Logo、选区)。
- 文字至图表 / Mermaid 弹层的页签下划线、输入框、插入按钮、AI Beta 标改成站点黑白主色。
-
- `/draw`「保存到本地」不再弹中间层,直接走系统另存为(Ctrl+S 同样);菜单项补下载图标。
-
- `/draw` 二级菜单改 portal 到 body,不再吃 Excalidraw 下拉的边框/间距;无权限锁改成 SVG。
- 空画布默认跟站点黑夜(void 黑);首选项行距和画布色点自己排,分类改成自定义下拉。
- 帮助/导出/保存到本地等弹层跟站点黑白主色,弹层和侧栏补开合动画。
-
- `/draw` 云端保存收进汉堡「保存到 ›」二级:本地保存、标题、分类、保存到 OSS 都在侧栏,主菜单不再堆「云端保存」分组。
- 二级里的标题/分类改成矮发丝线输入,去掉过高的输入框。
-
- `/draw` 汉堡菜单里的首选项收成「首选项 ›」二级浮层,开关和画布背景不再在主菜单里往下堆。
-
- 新增 `POST /web/diagrams/ai`:需登录且账号含 `diagrams`,走系统默认 `isActive` 模型;`mode` 为 mermaid 或 html,专用提示词,不复用机器人 RAG。
- 后台 Web API 调试文档补流程图 AI 接口;该口限流 10 次/分钟。
-
- `/draw` 文字生成图接 mono 系统默认 AI;无 `diagrams` 权限时「从代码生成图」「保存到 OSS」显示弱化文字加锁,不再跳登录。
- 汉堡菜单补回首选项(网格 / 吸附 / 禅 / 查看 / 属性 / 工具锁 / 箭头绑定 / 画布背景,不含主题和语言);命令面板和画布查找补图标。
- 清掉帮助、素材库等 Excalidraw 外链;去掉「浏览素材库」,只留本地打开;右键菜单和搜索框漏网英文再硬编码一层。
-
- 命令面板改成站点自己的中文浮层(Ctrl+/ 或菜单),查找侧栏改开 `default/search`,欢迎屏提示也改成硬编码中文。
- 漏网英文(placeholder、aria-label、菜单名)再扩一层硬编码对照;云端保存输入保持透明发丝线。
-
- `/draw` 云端保存(标题、分类、保存到 OSS)收进汉堡菜单「云端保存」,不再占画布顶栏。
- 命令面板、画布查找等简中包缺译的英文改成硬编码中文,并补一层界面文案替换(不含画布里用户写的字)。
-
- 左下角「最近」只在博客首页 `/` 显示;其它页 SSR、软导航 after-swap 都加上 `site-skin--no-recent-pages` 立刻藏掉。
- 工具页仍上报最近常访,回到博客后列表照常更新。
-
- `/draw` 给 `astro-island` 和舞台明确高度,Excalidraw 绝对铺满剩余区域,避免父级高度为 0 导致画布空白、工具栏点不到。
- Header 切昼夜时,若画布仍是默认黑/白底,跟站点背景一起切;用户自选的场景底色不改。
-
- `/draw` 保存条移出 Excalidraw 画布层,避免欢迎屏/画布 overlay 挡住「登录后保存」。
- 工具岛不再跟 void 黑同色:`--island-bg-color` 用前景 10% mix,图标走 `--site-fg`,昼夜都能看见工具栏。
-
- Admin 文章编辑器加「引用幻灯片」:TipTap `slideEmbed` 节点写成 `.article-slide-embed` 占位,插入时自动 `embedEnabled=true`。
-
- 公开入口 `/draw` 接入 Excalidraw 画图层:锁简中、去掉社交/登录/协作/包内主题开关,壳层颜色桥到 `--site-*`,草稿走 IndexedDB,登录且 `diagrams` 才把 WebP + 场景 JSON 存到 gallery OSS。
- 幻灯片编辑页加分类流程图轨,拖入或点击插入 Markdown 图片,现有 remark 预览立刻出图。
- 文章页 hydrate `.article-slide-embed`,走公开 embed API 播放;无权限或 404 显示「幻灯片不可用」。
-
- `/p/resume` 锁死手势缩放:viewport `maximum-scale=1` / `user-scalable=no`,`touch-action: pan-x pan-y`,并拦截 iOS `gesture*`。
-
- 站点皮肤 viewport 与遗留壳对齐:`maximum-scale=1` / `user-scalable=no`;`touch-action: pan-x pan-y` 禁捏合(灯箱除外),iOS 再拦 `gesture*`。
-
- 公开简历 `/p/resume`(flush 预览)纸面改为 `width: 100%` / `max-width: 820px`,窄屏收紧内边距并缩小证件照,长链接与教育行可换行;打印分页仍用 820px 测量稿。
-
- `/resume` 静态 iframe 吃满舞台宽,骨架窄屏缩小证件照占位;真正的纸面重排在 Admin 公开预览 `/p/resume`。
-
- `/resume` 静态操作栏改成文档流占位(不再盖在 iframe 上),栏用实心底(现场 `--site-bg`,静态白),正文从栏下开始,GitHub 链接不再穿出或挡住说明。
- 窄屏说明与按钮上下分排、文案可换行;工具条样式拆到 `_resume-studio-bar.scss`。
-
- 说明文案改到和简历纸同宽栏左对齐(静态 820px / 40px 内边距,现场 720px / 32px),字色改成 `--site-fg-bright` / 白纸 `#111`,并加左侧 2px 竖线,不再用弱化灰字。
-
- `/resume` 工具条左侧加说明「在职中,故隐藏在职工作项目与描述」;现场用 `--site-fg-muted`,静态白纸上用浅底字色,现场/静态都能看见。
-
- 骨架纸宽度改成一开始就是 820px(`max-width: 100%` 仅窄屏收缩),并写进 HTML inline,避免先 100% 再收到 820 闪一下。
-
- `/resume` 静态骨架改成和简历本体同宽(820px 居中),并从工具条高度下起铺,不再 100% 拉满去压右上角按钮。
-
- `/p/resume?from=stereo` 按字段丢掉进行中的工作项目(结束日期「至今」),不按项目名匹配;后台预览和无查询的公开预览不动。
-
- stereo `/resume` 现场稿按字段丢掉进行中的工作项目(结束日期「至今」),不按项目名匹配;Admin / mono 预览不动。
-
- `/resume` iframe 不再把生产默认打到 `localhost:3100`。线上用 `https://mono.oolaf.top/p/resume`;请求 Host 不是本机时,loopback 预览地址会改写到公开 Admin。
- `.env.mac` 与 PM2 环境补上 `PUBLIC_RESUME_PREVIEW_URL`。
-
-
-
- Admin `/setting` HLS 白名单改为服务端分页:`GET /web/tv-hls-hosts?page&pageSize` 返回 `{ list, page, pageSize, total }`,默认 20 条、pageSize 上限 100;播放学习仍走全量表缓存,不受列表分页影响。
- 设置页白名单表接翻页;删到空页会回到最后一页。
-
- kanju 搜索把 catalog `poster_url` 映射为 `cover` 返回;iyf 搜索 cover 恒为 null,不回 imgPath。
-
- 看剧AI 搜索卡使用目录 `poster_url` 做封面;爱壹帆仍用文字占位,不接 imgPath。
-
- 续看卡片缩小,右上角 badge 标片源(爱壹帆 / 看剧AI),删除钮收到左上角。
- 搜索源从独立芯片改成搜索框内下拉;收藏/豆瓣不再挂源切换。
- 片库搜索样式拆到 `tv-library-search.scss`,避免单文件超 500 行。
-
- kanju 目录里的 `zy.baipiaozhe.com/.../yjm3u8/YJ-*.m3u8` 不是播放列表,源站 301 到自身;hls-proxy 改为先请求 `player.baipiaozhe.com/v1/playback/resolve/{YJ-}`,拿到真实 m3u8 再代理。
- 解析出的 CDN 域名用已放行的 baipiaozhe 父域学习进 HLS 白名单;kanju 取流 Referer 改为播放器域,避免再跟 301 死循环。
-
- 注册第二播放源 `kanju`(看剧AI):HMAC-SHA256 签 `x-ai-movie-timestamp/nonce/signature` 后打 browse/catalog 与 catalog/episodes,只取 `urls.yjm3u8`;不建 `/v1/threads`,不用对方历史。
- HLS 按 source 选 Referer(kanju 不用 iyf/pipecdn 映射,允许一跳 https 白名单跳转);种子白名单加 `baipiaozhe.com`。
- 历史/收藏/跳过偏好与 search/play 的 `mcId`/`videoId` 抬到 128;增量 SQL `scripts/migrations/20260915-client-tv-mcid-varchar-128.sql`。
-
- 片源芯片会列出 mono 注册的看剧AI(`kanju`);搜索/播放/历史/弹幕仍走本站 `source::mcId`,不接看剧侧栏历史。
- 播放 href 与 `tvMediaKey` 覆盖看剧 `av_` 长 id(最长 128)。
-
- Setting 影视片源把清单/切片代理从操作按钮改成独立开关列,开合状态与启用列一致,切片关仍依赖清单开。
-
- 影视片源改成 registry + Setting `tv.sources`:启用/默认/清单代理/切片代理;`GET /web/tv/source/list` 只返回已启用源。
- search/episodes/play/hls-proxy 可选 `source`,缺省用 defaultSource;play 响应带 proxy flags;切片关时清单里 ts 保持 CDN 原址。
- 历史/收藏唯一键改为 (用户, source, mcId),空 source 回填 iyf;增量 SQL `20260915-client-tv-history-favorite-source-uidx.sql`。
- iyf HLS Referer/主机映射抽到独立策略模块;出站仍共用 `CLASS_PROXY_URL`。不加第二播放源。
-
- 影视从单源对象改成源列表:先拉 `/web/tv/source/list`,搜索/播放/历史/收藏/弹幕绑定都带 `source`,身份用 `source::mcId`。
- 播放页 `/tv/play?source=&id=`;旧链接无 source 时用默认源。`proxyPlaylist` 为真才包 hls-proxy。
- 片库用现有 tab 样式渲染源芯片(现网仅一项);豆瓣仍只搜当前选中源。
-
-
-
- 窄屏助手底部输入框跟 iOS 键盘:对话层贴 visualViewport,聚焦时连续对齐键盘动画,并取消 Safari 把页面顶起。
- 键盘升起时去掉 home indicator 垫高,避免输入条和键盘之间空一截;开层时给 iOS 加上 `interactive-widget=resizes-content`。
-
- 公开内容助手窄屏改为全屏对话层:占满 visualViewport、返回关闭、建议横滑;开面板不自动弹键盘,有对话后收起芯片。
- 展开时不再抬高避开音乐条;输入框 16px 避免 iOS 缩放。桌面浮窗交互不变。
- `_robot.scss` 拆成 panel / motion / mobile,避免单文件超 500 行。
-
- 文章封面按配图下沿亮度选字色:深色图白字 + 黑遮罩,浅色图黑字 + 白遮罩,不再跟站点昼夜主题绑死。
-
- 文章封面改回「整张配图铺底 + 下沿遮罩 + 文字叠图」:拿掉文案区实心底,舞台加高到约 480px,遮罩只在下半段用 `--site-bg` 渐隐,保证字色对比且不再把图压成一条。
-
- 首页软进文章详情时 ClientRouter 会用旧 SSR 样式盖掉封面文案 padding。把 banner 内边距和短遮罩钉进 SiteLayout inline,并给 copy 加上 `border-box`,避免首次进入贴边。
-
- 文章封面文字遮罩改成贴着文案的固定短渐变(约 56px),不再按整张 banner 百分比从四成高度铺实色。
-
- 后台主栏不再用 `100vh` 内容区叠固定顶栏 padding:顶栏回到文档流,内容区只吃剩余高度;未超出视口时不再出现右侧滚动条。
-
- 封面舞台内文案补回左右/底内边距;返回与封面、封面与划线的间距收紧。
- 封面图不再进 PhotoSwipe 预览。
- 阅读栏 `--site-article-body-measure` 从 42rem 调到 45rem。
-
- 文章详情封面舞台与底部评论区都收到 `--site-article-body-measure`,和正文同一栏宽。
-
- 文章已选标签不再走 Arco 多选芯片(会把「待保存」和名字粘成一段字)。已入库用绿色实线芯片,未保存用金色虚线 + 独立「待保存」徽章。
-
- 误删的封面舞台加回:封面仍吃满 `.site-article`,不跟阅读栏收窄。日期/标题/摘要、划线、正文继续 42rem。
-
- 文章详情去掉封面舞台。日期、分类、标签、标题、摘要和划线与正文同一栏宽(`--site-article-body-measure`)。
-
- 后台顶栏补上 tags-visited:打开过的页面显示为可关闭页签,工作台固定;`/setting`「后台界面」可开关,配置键 `admin.tags_visited.enabled`(默认开)。增量 SQL `scripts/migrations/20260914-admin-tags-visited-enabled.sql`。
- 右上角账号胶囊补 hover / 下拉箭头;菜单增加「系统设置」,仅 `config:view` 可见可进。
- 新建文章自定义标签:已入库与「待保存」芯片样式分开,待保存用金色虚线。
- 保存文章时给标题、摘要、正文(跳过 code/pre)和官方划线在中文与英文/数字之间补左右空格。
-
- HarmonyOS 只挂了 Regular,却把 `@font-face` 标成 `400 700`,浏览器把粗体映射到同一份 Regular,`strong` 看起来不加粗。改回 `400` 并打开 `font-synthesis: weight`。
- 文章详情只收窄 `.site-article__body`(`--site-article-body-measure: 42rem`),masthead 仍吃满主栏。
- 标题摘要去掉 `46rem` 上限,铺满 `.site-article`。
-
- 封面遮罩实色上提到约四成高度,文案顶 padding 加高,meta 一行也坐在不透底上。
-
- 文章封面遮罩加实:约六成高度起就是不透的 `--site-bg`,标题摘要不再透出配图。
-
- 文章封面舞台加一层随主题走的底遮罩,下沿落到 `--site-bg`,标题和摘要不再跟配图串色。
-
- 修复 `SiteArticleHeader` 编译错误:Astro 不用 `<>` 碎片,遮罩改放进封面 figure。
-
- 文章详情 masthead 改成封面舞台:图裁成矮带,日期/分类/标签/标题/摘要叠在下沿,用页面底色渐隐;不再竖着叠五段。
- 无封面时同一套 copy 收成一行 meta + 衬线标题;摘要最多两行。
-
- 文章详情把列表封面配图接到标题下,规则与正文图一致(等比、限高、可点开预览);无封面不占位。
-
- 影视投屏只有声音没有画面:hls.js 的 MSE blob 不能远投视频轨。Safari/iOS 投屏时改交真实 m3u8;Chrome 等禁止远投 MSE,并强制 video 合成以免 overlay 被丢掉。
-
- 旧引擎(无 module / 无 CSS 变量)只动态加载 `/legacy/readable.css` 与 `gate.js`:顶栏升级提示 + 单栏可读,不补全 site 皮肤。
- 现代浏览器不下载 legacy 资源;`?legacy=1` 可在现代浏览器预览该模式。
- 能力谓词落在 `src/lib/legacy/engine.ts`,与 `SiteLayout` 内联 ES5 探测对齐。
-
- 白天分享海报标题不再白字叠白底:浅色修饰类和 article/post 写在同一节点上,标题改为墨色。
-
- 「分享海报」改成下拉:可选黑夜或白天封面,各自生成、缓存和下载。
- 白天成片走白底墨线,banner 改日轮与发丝光;黑夜仍是月食。
-
- 分享海报离开旧杂志绿/米色:成片改 void 黑 + frost 发丝 + HarmonyOS / 衬线标题,二维码改黑白。
- 顶部 banner 重画成月食与轨道,不再用五线谱和金色散点。
-
- 正文划线底色加重:mine / official / popular 改走 `--site-hl-*`,黑夜约 40%/30%/22% 前景,白天约 16%/12%/9%,不再用 10% 白或 24% 霜。
-
- 文章详情有划线时「我的划线」默认展开;超过 3 条时列表下方出现展开/收起,收起只留前 3 条。
-
- 公开内容助手只在博客 `/` 与文章详情 `/articles/:id` 出现;软导航离开后收起,不再带到速记等其它页。
- 速记报错改成底栏 dock 里输入框上方的一行字,不再用会被压缩、随后被 Composer 盖住的整块 `SiteErrorBlock`。
-
-
-
- `/translate` 各引擎译文旁加复制图标,点击复制结果;成功后短暂变成对勾。昼夜都走 `--site-*`。
-
- 77 篇导入文共用媒体 `3248`(`blog-img.png` 电脑插画),抽正文首图也会命中同一张;抽图逻辑改为跳过该默认图。
- 新增 `apply:article-covers`:先上传再引用。标题能对上的用本地生成封面,其余按标题下 Unsplash 图入库写成 `cover` 媒体,不热链、不清标签。
- 回填脚本的 Unsplash 兜底改为下载后上传媒体库,不再只写 `cover_url`。
- Unsplash 触发 429 后,剩余共用默认封面改为按分类用已生成主题图做独特色彩/裁切变体,再上传引用。
-
- 导入文章若共用同一张封面,可用 `yarn workspace @oolaf-mono/server backfill:article-covers` 回填:重复或空封面先抽正文第一张真图,没有再按标题/分类/摘要搜 Unsplash;只改 cover,不清标签。支持 `--dry-run`。
- 后台新建/更新文章时,封面为空则自动抽正文首图(媒体库图写 coverMediaId,外链写 coverUrl)。
- 抽图、封面指纹与 Unsplash 检索词抽到 `article-cover-from-content.ts`,随机封面中文预设与回填共用。
-
-
-
- 文章代码复制按钮改挂在 `pre` 上,不再套 `site-article-code-frame`。软导航首次进入若已套壳会拆掉。
- `pre > code` 铺满且不描边、不铺底,避免 Prism 后注入时再画出里圈。
-
- 文章代码块只留 `pre` 一层边框底。复制按钮的外框不再自己描边、铺底,避免大盒再套小盒。
-
- 文章代码块不再继承正文 `overflow-wrap: anywhere` / `word-break`,关掉连字,避免 `fix` 一类短行看起来像叠字。
- 代码框改走 `--site-*` frost,去掉 GitHub 灰底;未加载的 Prism 语言(如 markdown)降成 `language-none`。
-
- 复制更新提示词开头写明:连词、先审后 SQL 等约束对后台每一篇文章同等生效,当前 id 只是代入,不因题目或仓库放宽。
-
- 文章「复制更新提示词」补上连词硬约束:整篇摘要/正文(含旧段)禁用指定并列、选择、转折、因果连词;旧句带禁用词必须改写,不得原样抄出。
- 交付顺序改为先发完整文案给用户审,明确通过前禁止写 SQL / 写库;独立仓库产品须读该仓库 LOGS / README / git log。
-
-
-
- 修复 Stereo 直播刮华视失败:Cloudflare 对 Impit 旧 `chrome`(约 124)指纹直接 403 挑战页;`WebLiveHuavodService` 改为 `chrome142` 并同步 UA。
- HTTP 非 2xx 时识别 `Just a moment` / Turnstile 验证页,提示更新华视 Cookie,而不再只报 `huavod HTTP 403`。
-
- 定时任务运行记录保留从 7 天改为近 3 天(清理与列表窗口一并改)。
- Stereo 进页 Redis 预热改为 1 小时:公开缓存 TTL `3600`,定时任务 `web-entry-warmup` cron 改为 `0 * * * *`。增量 SQL `scripts/migrations/20260910-web-entry-warmup-hourly.sql`。
-
- 定时任务运行记录改为只保留近 7 天:启动与每日按 `started_at` 删除更早行,列表查询同样限制窗口。
- Admin `/system/schedule` 运行记录文案标明「仅保留近 7 天」。
-
确认评论邮箱
邀请制评论