mole404
|
db05433596
|
feat(细节三): 确认框动画与背景位移、主菜单防误触高亮、头像阻塞加载、弹窗滚动链
① 三个(实为四个)sweetalert2 确认框(设置权限/重命名/删除/删相册):保留原实现,只改动画 +
斩断它对 body 的动手脚。四处 Swal.fire 加 heightAuto:false + scrollbarPadding:false;
common.less 里把 .swal2-show/.swal2-hide 换成与 x-modal 同一套(桌面 300ms ease-out 淡入+
scale .95→1、200ms ease-in 淡出;<768px 换成 translateY(16px)),遮罩过渡同源,并用
html body.swal2-shown:not(...) 兑掉 sweetalert2 对 body 的 overflow/padding 注入(不用 !important)。
实测:修前 4 个弹窗×2 视口都会让整页位移(桌面滚动条消失 +8px、手机注入 padding-right 8px 且
文档高 +20px、工具栏换行下移);修后逐项相等(关闭后复原也逐项相等)。动画实测 opacity 落在与
x-modal 同一条贝塞尔曲线上(如 ct=100/300 实测 0.6853 vs 曲线 0.6851,线性应为 0.3333)。
② 长按主菜单防误触高亮:把二级菜单那套手势级 arming 复用过来(menu-arming,420ms + 抬手后 260ms,
跟手势走),只在「这一发菜单确实紧随一次触摸」时武装,桌面右键路径一行都不走。
CDP 真触摸实测(390x844、iPhone UA、手指压在菜单项上):修前 elementFromPoint 命中 <a>(会高亮,
钉住粘滞 :hover 后整行变蓝 = 老师截图那个现象);修后按住期间/抬手+60ms 命中的都是外层容器、
不跳色,抬手+480ms 恢复正常可点;冗余窗内真点「复制图片」仍触发、点「复制链接」仍就地展开子菜单、
桌面鼠标 hover/点击行为与改前逐项一致。
③ 右上角头像:真因查明 —— 它是外部服务 https://cravatar.cn/avatar/<md5(email)>?s=96&d=mp&r=g
(Utils::getAvatar),实测 376B、0.85~0.96s、每次 1 跳重定向,且页面 load 事件被它拖住(实测
慢源下 load 3214ms)、加载失败时没有任何兜底(所以空着)。改法:先渲染固定 28×28 占位(不抖动),
真实地址放 data-avatar-src,页面 load 之后再异步接上;加 decoding=async + onerror 失败兜底
(名字首字色块圆圈)、成功则移除首字占位。实测:慢源下 load 3214ms → 470ms(不再等它),
404 时从"空白"变成"首字圆圈",且头像块与整个按钮的位置尺寸与修前逐项相等。
④ 手机在弹窗内下滑底部空一块:真因是**滚动链**——弹窗内滚到尽头后滚动传给背后文档(实测修前
document.scrollTop 从 0 冲到 2628),安卓上地址栏随之收起、底部露出空带。修法:弹窗滚动容器加
overscroll-contain 阻断接力;高度链上残留的 100vh 换成「同一块内先 vh 后 dvh」的内联声明
(CSSOM 实测 min-height 解析为 100dvh,祖先链已无 vh)。实测:修后 6 组手势(手机/桌面 × 长/短
内容 × wheel/touch)背后文档 scrollTop 恒为 0,弹窗内仍能正常滚到 maxScroll;桌面各项与改前逐项一致。
验证:longpress 79/79、sidebar 6/6、images-modal 35/35、images-modal-dom 35/35、swal-theme 48/48;
webpack compiled successfully;补丁钉住值同步为 context-js.js 3614ec17…、images.blade.php 09ba35f3…,
补丁重生成 2802 行且「打回上游 = 仓库文件」字节一致。另清理了子代理遗留的调试脚本 test/dbg-gap.mjs。
|
2026-09-29 17:02:01 +08:00 |
|
mole404
|
5773d432fb
|
feat(细节二): 弹窗观感统一 + 三个旧弹窗换新装 + 返回键间距真修好 + 手机弹窗高度适配 + 上传全部按队列显隐补漏
①弹窗:
- 「移动到相册」弹窗:相册列表下那行「我也是有底线的~」(无限加载的哨兵)按弹窗 id 收窄隐藏,
footer 多余的横线(border-t)去掉;列表仍可滚动、触底仍会继续加载相册。
- 两个新弹窗排版统一:标题 16px semibold、标签 13px / 值 14px、行高宽松、字段行装进一张
divide-y 卡片等距排列;只用设计令牌色(亮/暗自动正确)。
- 右键菜单的「删除」「重命名」「设置权限」三个 sweetalert2 确认框换成同一套观感
(12px 圆角、16px 标题、13/14px 正文、按钮 = ls-btn/ls-btn-primary/ls-btn-danger、
输入框 = ls-input);JS 一行未改,确认/取消/校验流程原样。皮肤不用 !important,
靠 html 前缀提权重压过 swal2 运行时注入的样式。
②「<返回」间距真因(上一轮判断错了):标记里那个 mr-1 工具类**从未被 Tailwind 生成**
(tailwind.config.js 的 content 只扫 blade,扫不到 resources/js 里的类名),图标 margin-right
实测 0px;且 context-js.css 在页面里没有版本串、iOS 会吃缓存。修法:规则同时写进
context-js.less 与 common.less(后者由 layout 用 ?v=assetVersion() 引入,必然重新拉取)。
真触摸复现实测:图标右缘→文字左缘 = 7px(修前 0px),旧缓存 CSS 情形下同样 7px。
③手机弹窗底部空一块:共用组件 modal.blade.php 的容器改 h-[100dvh]、内层保留 min-h-screen 兜底
(CSSOM 实测 dvh 声明排在 vh 之后,支持则用 dvh、不支持自动退回 100vh);桌面端逐项实测
与改前完全一致(容器/卡片高度、居中位置、页面可滚动高度均未变)。
④「上传全部」显隐补漏:漏在「逐张手动删除」那条路径上(走的是另一个函数),现已接上,
共覆盖 入队/状态变化/自动清除/逐张删除/一键清空 五条路径;文案去掉「同时」二字。
另修一处会让构建失败的坑:context-js.less 注释里写了 resources/views/**/*.blade.php,
其中的 **/ 提前闭合了 /* */ 注释 → LESS "Unrecognised input"(已改写该句)。
验证:longpress 79/79、sidebar 6/6、images-modal 35/35、images-modal-dom 35/35、
swal-theme 48/48(新增,含 jsdom 复刻注入顺序验证皮肤真生效 + 一条反证);php -l + view:cache
exit 0;重建产物核对 .text-[16px]/.h-16/.transition-colors/.divide-y/.min-h-[100dvh]/.h-[100dvh]/
#image-movements-modal/.swal2-popup 全部存在;钉住的 context-js.js 两份 md5 仍 = b916555a…,
images.blade.php md5 已同步为 00f38dbf…,补丁重生成 2578 行且字节级验证通过。
|
2026-09-29 15:41:13 +08:00 |
|
mole404
|
30862d602f
|
feat(图片页 1/2): 详细信息与移动到相册改用居中卡片弹窗、二级菜单返回键加空隙
#1 「详细信息」「移动到相册」弃用右侧抽屉,改复用 x-modal 的居中卡片弹窗(新增
#image-detail-modal / #image-movements-modal 及其内容容器,三个新模板):
- 详细信息:顶部小缩略图 + dl 行式布局(<640px 自动上下堆叠),标签 13px / 值 14px /
leading-6;字段顺序按老师要求 = 上传时间 → 图片名称 → 其余 10 项(原抽屉里 12 项一个没删,
只换位置);弹窗内不放复制链接/下载/删除(单一职责)。
- 移动到相册:单选列表(当前所在相册带「当前」徽标)、行 min-h-[44px](手机点击区)、
未选中时「移动」disabled;请求逐字沿用原实现(同 route user.images.movement、同 payload);
点「移动」才提交,成功关弹窗 + resetImages + toastr。
- 右侧抽屉保留本职(工具栏「相册列表」入口、自带无限加载、相册增删改查)原样不动;
桌面右键、手机长按、工具栏三个入口都走新弹窗。
#2 二级菜单「<返回」箭头与文字间距:context-js.less 加 7px(选择器权重压过标记自带 mr-1)。
关键:本轮的 images.blade.php 改动不属于补丁文件(context-js.js 两份 md5 全程 = Dockerfile 钉住的
b916555a…,未动),Dockerfile 的 images_blade_md5 已随自证同步更新为 27bb3f20…,补丁重生成 2563 行
且「打回上游 = 仓库文件」字节一致。
验证:四套回归我自己跑过 —— longpress 79/79、sidebar 6/6、images-modal 35/35(静态契约:
12 字段与顺序 / 13-14px 字号 / min-h-44 / 请求不变 / 无硬编码色 / 返回键 7px / 补丁 md5 未变)、
images-modal-dom 35/35(jsdom 真跑页面内联脚本:点菜单 → 内容进新弹窗、抽屉全程为空且未被推开、
单选互斥、点「移动」实发 {selected,id,album_id} 后关弹窗、抽屉路径仍能筛选相册);
php -l + view:cache exit 0;重建产物含 text-[13px]/[14px]/min-h-[44px]/max-h-[50vh]/ls-badge 等。
|
2026-09-29 14:34:25 +08:00 |
|
mole404
|
1a57f7660c
|
feat(细节优化 3/4/5/6/7): 三个小按钮统一圆形、上传全部按队列显隐、最小号字抬档加深、侧栏容量上移、清空✕常显
#3 右上角三个小按钮统一为圆形:主题按钮 w-9 圆角方块 → w-10 h-10 rounded-full;存储策略去掉
内层带边框的小圆圈(就是"套娃"来源),并统一 h-10 w-10 rounded-full + 同 hover;头像本来就是圆。
实测三个 border-radius 均 9999px、高 40px(窄屏三个都是 40px 正圆;宽屏后两个带文字所以是胶囊)。
#4 「上传全部」只在队列里还有待上传文件时出现:新增 syncQueueActions(),在 状态变化/入队/自动清除/
手动清空 四个时机统一 toggle;按钮初始 hidden。
#5 最小号字 12.5px → 13px,同行的最浅灰 ink-3 → ink-2(仪表盘 2、控制台 8、上传页 3 处)。
亮暗双主题实测对比度:ink-2 = 6.0:1(亮)/ 6.92:1(暗),均 ≥4.5 小字可读线。
#6 侧栏「容量使用」mb-5 → mb-16,避开浏览器左下角链接预览的遮挡。
#7 清空队列的 ✕ 从 hidden group-hover:flex → 常显 opacity-40、hover 不透明(触屏没 hover,手机原来点不到)。
验证:重建产物确认 .text-\[13px\] / .opacity-40 / .mb-16 / hover:opacity-100 均已生成;
php -l + view:cache exit 0;jsdom longpress 79/79、sidebar 6/6。
|
2026-09-29 14:24:25 +08:00 |
|
mole404
|
03928287cf
|
feat(控制台/上传组件): 控制台清爽化 + 上传组件重做(只改样式层,钩子与字段零改动)
控制台(admin/console/index.blade.php,247→259 行):
- 概览 8 张杂色统计卡 → 4 张主卡(图标块 w-8 h-8 bg-brand-soft + 弱化标签 text-[12.5px] + 大数字
text-[21px] font-semibold tabular-nums);手机 2 列、lg 起 4 列。
- 新增「上传统计」卡:今日/昨日/本周/本月 4 格(text-[17px] 数字)。
- 「系统情况」+「软件信息」合并为「系统信息」一张卡:去斑马纹改 divide-y/divide-line,
行内边距 py-5 → py-2.5,7 组 dt/dd 一个不少。
- debug 警告条硬编码 bg-red-500/white → 令牌 bg-danger-soft/text-danger。
- 趋势图段(@push('scripts') 整段 + #chart 容器 + ECharts 配色)字节级未动。
上传组件(components/upload.blade.php,366 行;第 90 行起 JS 零改动):
- 标题 Image Upload → 「上传图片」,去掉 text-shadow: -4px 4px 0。
- 拖拽区重做:fa 图标块(w-14 h-14 rounded-2xl bg-brand-soft)+「拖拽到此处」+ 说明 +
两个真按钮「选择文件」「上传全部」(ls-btn ls-btn-primary,上传全部由隐式改为真按钮)。
- 队列行紧凑:36px 缩略图 + 文件名/大小 + 底部 1.5px 进度轨 + 28px 图标按钮;
删掉遗留死类 aspect-w-1/aspect-h-1;全文件小字统一 12.5/13.5px,无 text-xs。
自查(上层独立复核,非子代理自述):
- 上传组件 21 个 JS 钩子/ID/data 属性 grep 全部命中;控制台 16 个字段与全部绑定命中;
text-shadow / aspect-w-1 / text-xs / "Image Upload" 残留均为 0;php -l + view:cache exit 0。
- 重建后确认新类都进了 public/css/app.css(text-[12.5px]/min-h-[200px]/w-[36px]/h-[1.5px]/
lg:grid-cols-4/sm:col-span-3/divide-line/bg-danger-soft/ls-btn-primary 等)。
- 真 CSS 渲染复现:缩略图 36x36、进度轨 1.5px、图标按钮 28x28、「上传全部」实心蓝 rgb(37,99,235)
radius 8、无 text-shadow、无 JS 报错。
- jsdom 回归:longpress 79/79、sidebar 6/6。
|
2026-09-29 13:38:44 +08:00 |
|
mole404
|
a030f71813
|
feat(我的图片): 图片页改为整页滚动 —— 手机地址栏可以在这一页收起了
背景:之前为了修地址栏把布局容器改成正常流,但图片页仍是「自带滚动容器」(#images-scroll
absolute inset-0 + overflow-y-scroll),所以那一页的文档根本不滚动、地址栏照旧不收起。
改动:
- #images-scroll 从「绝对定位的自滚容器」改成普通块(随内容长高,position:relative/overflow:visible);
图片墙的外壳去掉 flex-1/overflow-hidden(改由整页滚动承载),保留 -mb-14 抵消容器的 pb-14。
- 工具栏改 sticky top-14:整页滚动后它不会跟着滚走(原来靠不滚动才一直可见)。
- 抽屉与遮罩从 absolute 改 fixed(壳不再有确定高度,absolute 会失去参照)。
- utils.infiniteScroll 新增 root:'window'(跟整页滚动),图片页改用它;抽屉里的相册列表仍用容器内滚动。
绑定/解绑都带事件命名空间,destroy 时一并清理。
验证(真 app.css + 真 justifiedGallery + 真 utils.infiniteScroll,标记从源文件正则抽取而非手抄):
手机 390x844 / 桌面 1280x800 两档:
- 文档可滚动 = True(手机 scrollHeight 7212 vs 视口 844)→ 地址栏收起的前提成立
- #images-scroll position=relative / overflow-y=visible,高 7119px(随内容长高,不再 0 高)
- 滚到页底 → 加载器被调用 1 → 2 次(自动翻页仍然生效)
- 工具栏 position=sticky,top 滚前 56 → 滚后 56(吸在固定顶栏下)
- 抽屉/遮罩 position=fixed;无 JS 报错
|
2026-09-29 13:32:04 +08:00 |
|
mole404
|
838afdc04c
|
feat(我的图片/菜单): 缩略图文字先隐藏、去掉底部空白带、二级菜单弹出瞬间不再跳高亮
① 缩略图上的名称/时间:给遮罩加 hidden 先隐藏(代码一行没删,去掉 hidden 即可恢复;
遮罩隐藏后点击落在 img 上,看图器照旧正常打开)。
② 图片墙底部那条空白带:
- 布局容器自带 pb-14(56px,实测网格底距视口底正好 56px),图片页的网格壳加 -mb-14
抵消掉,图片直接铺到视口底(实测该间距 56px → 0px);容器上没有固定底栏要吃这个内边距。
- 「加载更多/到底了」块上下内边距 3rem → 1rem(实测该块 118px → 54px)。
③ 「复制链接」二级菜单弹出的一瞬间会有一项跳高亮(功能上不误触发,是浏览器把手指底下
那项判成了 hover 目标)。做法:就地替换后给面板挂 .submenu-arming —— 窗口内里面的项
不接受指针事件、hover 底色也压平;窗口从按下起算并在抬手后续 260ms(按住再久也不跳色),
手指挪去点别处则立刻解除。
真触摸实测(CDP,iPhone UA + 模拟粘滞 hover):
抬手后 90ms → arming=True,手指底下命中 LI 而非菜单项 → 浏览器无从高亮 ✓
过窗 690ms → arming=False,命中就是该项,点击照旧触发 Url ✓
|
2026-09-29 12:51:53 +08:00 |
|
mole404
|
aac20ff103
|
fix(我的图片): 图片墙整片消失 —— 布局回正常流后内层壳不能再靠祖先高度
根因:为让手机浏览器收起地址栏,布局容器从「absolute + 确定高度」改成了正常流
(min-h-screen)。而 images.blade.php 里那层壳写的是 h-full(百分比),父级高度一旦
不再确定就解析成 auto → 它内部的 #images-scroll 是 absolute inset-0,父级内容高 0
⇒ 计算高度 0px、图片墙被 overflow-hidden 整片裁掉(数据完好、仪表盘计数正常)。
修法:该层壳改成 flex-1(容器是 flex flex-col + min-h-screen),自己吃掉工具栏
以下的剩余高度;工具栏换行时也不会算错。
实测(真 app.css + 真 justifiedGallery,桌面 1280x800 / 手机 390x844):
改前 网格壳 computed height = 0px、#images-scroll 0px(内容 545/1296px)→ 整片空白
改后 网格壳 650.75px / 694.75px、#images-scroll 跟随内容,图片项正常可见
|
2026-09-29 12:26:07 +08:00 |
|
mole404
|
c2a9261d26
|
style(字号): 补上 images / upload 页遗留的 text-xs(12px → 13.5px)
|
2026-09-29 04:56:05 +08:00 |
|
mole404
|
6e0e44db0c
|
fix(自证): 补丁 md5 同步到 3f845ab5/6fbd6760(上一版漏改,CI 自证按设计拦住了);tools: 同步脚本改为按行标签定位 + 本地实算自证
|
2026-09-29 04:52:16 +08:00 |
|
mole404
|
6e1306d77b
|
fix(手机/桌面体验): 头像居中、二级菜单就地展开防误触、恢复根滚动、策略卡桌面卡内滚动、小字号抬一档
① 头像在圆形容器里偏左:按钮 h-10 pl-1 pr-2 左右留白不对称(左 4px / 右 8px),
且 <640px 用户名隐藏后只剩纯圆钮 → 改成 h-10 w-10 p-0 justify-center,
≥640px 用 sm:w-auto sm:pl-1 sm:pr-2 保持桌面胶囊形态不变。
实测:手机 390px 下头像左右留白各 6.0px,偏差 0.0px(原 4/8)。
② 二级菜单重合 + 误触:真机触摸带粘滞 :hover,手指一按「复制链接」二级菜单就先弹出来
(旧版还因侧向定位被 clamp 成压在主菜单上),抬手那发合成 click 直接落在菜单项上,
实测被判成「Url」并立刻复制。改为:
- 手机不再侧开二级菜单,改成**就地替换**(面板原地换成 Url/HTML/BBCode… + 顶部「返回」);
- touchstart 即切换并「武装」防误触:判据是**同一根手指那一发**(不是时长),
按多久(实测按住 700ms)抬手都不会误触;
- 守卫顺序:父项处理 → 守卫 → 「返回」;桌面仍保留右侧二级菜单 + 视口钳制。
真触摸(CDP Input.dispatchTouchEvent + CSS.forcePseudoState 模拟粘滞 hover)复现:
改前二级菜单被挤出屏幕外 116px、改后抬手触发动作 = [](什么都没发生)。
③ 手机浏览器地址栏不会自动收起:body 有 overflow-hidden + 内容区是 absolute + overflow-y-auto
的自滚容器,不是根滚动,浏览器只认根滚动。改成 body 去掉 overflow-hidden、容器回正常流
(pt-14 pb-14 补顶栏高度)。fixed 侧栏/顶栏不受影响,全仓无 JS 依赖该内部滚动容器。
④ 策略卡桌面端限高 18rem + 卡内滚动(md: 前缀,手机仍是一列全展开、不滚不截断)。
⑤ 小字号统一抬一档(11/11.5→12.5、12.5/13→13.5、13.5→14,14 以上不动),
受影响页遗留的 text-xs 一并抬到 13.5。
|
2026-09-29 04:49:25 +08:00 |
|
mole404
|
f14a5c1fcd
|
feat(仪表盘/安装向导): 仪表盘重排 + 安装完成页仓库地址换成本 fork
安装向导(安装完成那一步):
- 原来「打赏」那条挂的是上游 github.com/wisp-x/lsky-pro,换成
https://github.com/mole404/lsky-pro-docker(本 fork 仓库)
- www.lsky.pro / docs.lsky.pro 两行按要求保持不动
仪表盘(登录后的默认落地页)重排,数据/变量/后端一律没动:
- 概览四张卡:原来是一个 text-5xl 大图标挤着两行字 + 四种杂色(amber-500/danger/green-500/emerald-500),
改成 8x8 圆角图标块 + 弱化小标签 + 21px 半粗数字(tabular-nums 对齐),配色统一走 brand / brand-soft 令牌
- 新增「储存用量」卡:使用/总量 + 百分比 + 进度条(侧栏折叠时容量信息会隐藏,这里正好补上)
- 策略与我的信息改成 md 两列并排;策略列表加了「共 n 个可用」和行内弱化说明
- 我的信息:标签统一 text-ink-3 弱化、值 text-ink,分隔线走 divide-line;
未激活提示从 bg-red-400 text-white 换成 bg-danger-soft text-danger(暗色下才对得上)
- 角色组信息:原来 8 行竖着堆,改成 2 行 + 6 个小格子(并发/每分钟/每小时/每天/每周/每月),响应式 2→3→6 列
- 未激活邮件的重发 JS 一行未改
验证:
- php artisan view:cache 全量编译通过;npm run prod 重建后逐个 grep 确认新类真进了产物
(bg-brand-soft / bg-surface-2,3 / bg-danger-soft / tabular-nums / lg:grid-cols-6 /
text-[11.5px] 等,且 text-[11.5px]{font-size:11.5px} 实际存在)
- 配真 CSS + 真布局骨架做亮/暗/手机三态渲染:取色确认全部来自设计令牌
(亮 text-3 #8b95a3、暗 #6d7784;图标块 亮 rgb(238,244,255)+#2563eb、暗 rgb(22,35,59)+#3b82f6),
三态零横向溢出、零 JS 报错
|
2026-09-29 03:55:14 +08:00 |
|
mole404
|
f2242fdbaa
|
feat(导航/首页/控制台): 侧栏顺序调整、首页登录态跳我的图片、趋势图尺寸与暗色配色修复
1) 侧栏:仪表盘不再单独占一组,并入「我的」,组内顺序 仪表盘 → 我的图片 → 上传图片 → 用户设置
(只挪块;sidebar.blade.php 不在任何自证 md5 清单内)
2) 首页:/ 在登录状态下 302 跳 /images(原来无论登录与否都显示那个无侧栏的游客上传页)。
未登录行为完全不变:游客上传开着就还是那个上传页,关着则由 CheckIsEnableGuestUpload 送登录页。
/upload 与侧栏「上传图片」按钮未动。routes/web.php 在 Dockerfile 的上游纯净性自证清单里,md5 已同步。
3) 控制台趋势图:
- 尺寸不同步:原来只监听 window.onresize,而侧栏折叠改的是**容器宽度**、不触发窗口 resize,
画布留在旧宽度(实测折叠后画布比容器窄 224px,图表与卡片边框对不上)。改用上轮留下的侧栏
hook lsky:sidebar-toggled,等 300ms 过渡结束后 resize;window.onresize = 换成 addEventListener
(前者会覆盖别人挂的处理)。
- 暗色字色:ECharts 默认文字 #464646,暗底上几乎看不清且切主题不重绘。现在标题/图例/坐标轴/
网格/tooltip 全部读应用设计令牌(--lsky-text / -2 / -3 / --lsky-border / -2 / --lsky-surface),
并在 theme store 新增 lsky:theme-changed 事件(切亮/暗/跟随系统时重画)。
- 顺手去掉容器里那个多余的 <canvas>(ECharts 自己会建画布)。
验证:
- 侧栏顺序:从模板按出场顺序抽名称 = 仪表盘/我的图片/上传图片/用户设置 ✅,第一个分组标题已是「我的」
- 图表:把 blade 里的真脚本抽出来(@json 换样例数据),配真 echarts.min.js + 真设计令牌 + 真 300ms
过渡做对照:改前折叠后画布 960 / 容器 1184(偏差 224px)、标题色恒为 #464646;改后偏差恒定
-32px(= 容器 p-4 内边距,正确),切暗色时轴字色 #5a6472 → #9aa4b2、标题 #16191d → #e7ebf0;
两版均零 JS 报错
- jsdom 行为测试 70/70 + 侧栏 6/6;php -l;view:cache 全量通过;route:list 正常;verify_repo.py 全通过
|
2026-09-29 03:27:41 +08:00 |
|
mole404
|
c0940375ca
|
docs: 重新生成 patches/ios-longpress.patch(含菜单边界钳制补丁 + 同步三个文件的 md5)
|
2026-09-29 02:46:53 +08:00 |
|
mole404
|
c6a02d88c2
|
fix(菜单/控制台): 菜单与二级菜单做视口边界钳制、控制台信息项整理、版本升到 v3.1
1) 靠屏幕边缘右键/长按,弹出菜单跑到屏幕外(老师实测手机+电脑都有),二级菜单「复制链接」
时好时坏 —— 上游只在 above:'auto' 时做过纵向翻转,横向从来没钳制;二级菜单固定往右展开
(left:100%),且只在 hover 路径判一次 drop-left,纵向完全没人管,所以「跑不跑」取决于菜单
开在页面什么高度。
改法(只动定位,显示/隐藏逻辑一行不碰 —— 长按与点击防护依赖 CSS :hover 的真实可见性):
- 新增 clampMenu($dd):openMenu 定位完统一调用;按视口夹 top/left(主菜单是 body 下绝对定位、
坐标是页面坐标,所以用 pageXOffset/clientWidth 换算),比视口还高时给 maxHeight + overflow-y:auto
- 新增 fitSubmenu($li):hover 与 touch-open 两条路径都调用;每次先从「默认右开、无内联约束」
重算,避免上次残留;左右翻不够时用内联 left 兜底,纵向用内联 top 回拉,超高转内部滚动
- 子菜单里原先两处重复的 drop-left 判断合并成这一个函数
2) 控制台「软件信息」:删掉官方网站/使用手册两项,仓库地址改成本仓库
3) 版本号 v3.0 → v3.1(config/app.php 一行)
顺带把「手写资源版本串」这个坑根除:images.blade.php 引入补丁脚本那行的 ?v=ios-longpress4
改成 Utils::assetVersion('js/context-js/context-js.js'),由文件 mtime 自动失效 —— 之前手写
递增忘过一次,浏览器一直吃旧补丁,和上一轮 app.js 那次是同一类问题。
验证:
- 真 jQuery + 真菜单数据搭页面,在右下角右键/长按后量矩形(4 个用例:桌面右下角、桌面下滚 400px、
手机 iOS 右下角长按、手机下滚 600px):改后 4/4 主菜单与二级菜单都完整落在视口内(留 8px 边距);
**用改前的文件跑同一套用例,每个都报「跑出去 125~140px」** —— 证明用例真能抓到问题、也证明 bug 真实存在
- 暗色实拍:手机主菜单 + 二级菜单完整可见(二级菜单自动翻到左侧),桌面贴边不截断
- jsdom 行为测试 70/70 + 侧栏 6/6;php -l 全仓库;view:cache 全量通过;
verify_repo.py 全通过(含从 Dockerfile 解析的 16 条护栏)
- 补丁 md5 同步:078a0d98…(两份 context-js.js)、5d1926d2…(images.blade.php),
.code-revision 里的 md5 一并更新 → fork_sha 变化 → 容器会重新同步进卷
- patches/ios-longpress.patch 已用 tools/diff-vs-upstream.sh 重新生成
|
2026-09-29 02:46:20 +08:00 |
|
mole404
|
342d33534a
|
ui(侧栏折叠): 折叠后品牌块居中
原先折叠时只把品牌块左右内边距改成 .75rem,28px 的 logo 因此偏在左侧、右侧空一大截(老师实测反馈)。
改成 padding 0 + justify-content:center,让 logo 在整个 64px 栏里居中;折叠状态下手机端那个关闭按钮
本来就是 sm:hidden,不影响居中。
实测(真实构建产物 + 真编译 CSS):
- 桌面折叠 → 侧栏 64px、logo 中心偏差 0.0px、各导航图标中心偏差 0.0px、品牌名/容量区隐藏、内容边距 64px
- 桌面展开 → 侧栏 256px、logo 与图标仍然靠左(即老师要的那个左对齐,未被本次改动影响)、内容边距 256px
- 手机端 → 293px 抽屉、关闭按钮可见、什么都不隐藏、内容边距 0(零影响)
|
2026-09-29 02:30:22 +08:00 |
|
mole404
|
33e5e5f7e7
|
fix(侧栏/上传结果): 折叠按钮失效(资源缓存没失效) + 标签栏改换行显示全部 + 图标换箭头
1) 桌面/手机点折叠按钮都没反应 —— 不是 JS 的问题,构建产物里 toggleSmart 在的;
真正原因是布局里写死的资源版本串 ?t=20260928ui 一直没变,浏览器继续吃上一版 app.js,
新按钮调用的 $store.sidebar.toggleSmart() 在那个 bundle 里根本不存在。
改成 Utils::assetVersion()(取 public 下文件 mtime)→ 以后每次构建/卷同步都自动换版本号。
app / guest / install 三个视图全改;verify_repo.py 加守卫禁止写死(故意破坏一次验证过会报红)。
2) 上传结果标签栏:原来 flex-nowrap + overflow-scroll,实际是"有滚动也看不出、
Thumbnail url 被挤到可视区外"。改成 flex-wrap —— 6 个标签永远全部可见,窄屏自动折行;
标签内边距 px-8 → px-4,常见宽度下仍排成一行;按钮区 ml-auto + shrink-0,不再和标签抢位置。
3) 折叠按钮图标:桌面端 < / >(fa-chevron-left / fa-chevron-right,方向表示侧栏往哪收),
手机端仍是 ☰(抽屉语义);用 :class 绑定 store.collapsed 翻转。
验证(把真实构建产物装进 Chromium 真点按钮,不是看代码):
- 桌面点一下 → collapsed=true、html 加 sidebar-collapsed、侧栏 256→64px、内容边距 64px、
箭头 < 翻成 >、写入 localStorage;再点还原 256px
- 手机点一下 → 抽屉打开、折叠态纹丝不动、无 sidebar-collapsed 类;两端 JS 错误数均 0
- 标签栏:6 个标签全部可见且在容器内、1 行排下、按钮零重叠
- 测试 70/70 + 6/6;php -l / view:cache 全量通过;verify_repo.py 全通过
- context-js.js 双份字节一致(长按/点击防护未动)
|
2026-09-29 02:18:14 +08:00 |
|
mole404
|
bc3751b394
|
feat: 侧栏可折叠 + 上传结果按钮不再压标签 + 文案与对齐调整
1) 上传结果行:「复制全部 / 清除」原来绝对定位盖在右上角,压住 Markdown with link /
Thumbnail url 两个标签,且只在 hover 时出现(手机没有 hover,等于点不到)。
改为与标签栏同一行的左右两段:标签栏 flex-1 自行横向滚动,按钮固定右侧、常显。
(div 开闭数已核对:与原始一致,只多一层包装)
2) 侧栏品牌块去掉 sm:justify-center → 桌面端 logo + 站点名靠左(手机端本就不居中,无影响)
3) 文案:「设置」→「用户设置」(侧栏导航项、页面大标题「基础设置」、顶栏标题、头像菜单)
4) 桌面端侧栏可折叠(手机端抽屉行为完全不变):
- 折叠状态 = <html class="sidebar-collapsed">,由 stores/sidebar.js 管理并记入 localStorage;
app.blade.php 的首屏内联脚本在样式之前就贴类,不会「先展开再收起」地抖一下
- 折叠宽度 4rem 只留图标;文字、分组标题、容量区整体隐藏;导航项居中;每项带 title 便于悬停辨认
- 折叠规则全部在 @media (min-width: 640px) 内,并用选择器权重(html.sidebar-collapsed #app-sidebar)
压过工具类 sm:w-64 / sm:ml-64 —— 不依赖打包顺序(components 层总在 utilities 之前)
- 顶栏 ☰ 桌面端也显示:桌面=折叠/展开、手机=抽屉,同一语义;toggleSmart() 按视口分流
- 我的图片页:图片墙按容器宽度算布局,侧栏一动必须重排 —— 监听 lsky:sidebar-toggled,
等 300ms 宽度动画结束后 justifiedGallery('norewind') + viewer.update() + ds.setSelectables()
(这三个 API 在翻页加载数据时本来就在用)
- 不做「悬停临时展开」:那会让图片墙每次鼠标划过都重排
验证:
- 新增 test/sidebar.test.mjs(6 例,jsdom):默认展开 / 存过 collapsed 则加载即贴类 /
折叠写存储并派发事件 / 展开还原 / 手机端只开抽屉不动折叠态 / 桌面端走折叠。
与既有 70 例一起由 npm test 串行执行(CI 那步就是 npm test)
- 用真编译产物 + 真实 DOM 结构在 Chromium 里量计算样式:
桌面折叠 → 侧栏 64px、内容左边距 64px、文字/分组/容量隐藏、图标居中偏差 0px、按钮与标签零重叠;
桌面展开 → 256px / 256px;手机端即使贴了折叠类 → 侧栏仍 75% 抽屉、无隐藏、边距 0(确认零影响)
- php -l 全仓库通过;php artisan view:cache 全量编译通过;verify_repo.py 通过;
context-js.js 两份仍字节一致(e114c840…,长按与点击防护未动)
|
2026-09-29 02:00:53 +08:00 |
|
mole404
|
2c62c3219c
|
feat: 移除画廊与系统升级、版本号自维护(v3.0 + commit)、上传结果带缩略图、图片页加取消选择
1) 上传结果行带缩略图:每个链接(URL / HTML / BBCode / Markdown…)左边一张 40x40 缩略图,
多图时一眼看出哪个链接对应哪张图;非图片文件或取不到缩略图时自动不显示(onerror 兜底)。
缩略图地址接口本来就返回(links.thumbnail_url),只是原来没画出来。
2) 系统升级功能整体移除(不留死代码):
- 设置页整块 UI + 轮询 JS + update-tpl 模板
- 路由 admin.settings.{check.update, upgrade, upgrade.progress}
- SettingController 的 checkUpdate / upgrade / upgradeProgress
- app/Console/Commands/Upgrade.php(lsky:upgrade)与 app/Services/UpgradeService.php
- ConfigKey::AppVersion 及其惯例配置默认值
后台「关于」改为只显示:v3.0 <7 位 commit> / by mole404
- 版本与作者来自 config/app.php 的 version / author(不再读数据库 app_version ——
已装好的站点里那个值是安装时写死的,改代码默认值对它无效,这个坑踩过)
- commit 取自镜像内 .code-revision 的 fork_sha(构建时写入),每次构建自动跟随
- Utils::shortCommit() 统一实现;控制台「软件版本」同源改造
(它原来读被删掉的 ConfigKey::AppVersion,不改会直接 500)
3) 「我的图片」新增「取消选择」:桌面端在「删除」后面,手机端在折叠菜单里;
接进现有显隐逻辑(无选中时自动隐藏),点击 clearSelection() 后刷新工具栏。
4) 画廊功能整体移除:路由 / GalleryController / CheckIsEnableGallery 中间件 / 视图 /
设置项 is_enable_gallery / 侧栏入口 / ConfigKey::IsEnableGallery。
保留 justified-gallery、viewer.js、dragselect —— 它们是「我的图片」页的网格与多选库,
与画廊功能无关。数据库里遗留的 is_enable_gallery / app_version 配置行不再被读取,留着无害。
本机验证(无 docker,装了 php-cli + composer 做静态与编译层校验):
- php -l 全仓库 PHP 文件:无语法错误
- php artisan view:cache:62 个视图全量编译成功(后台页面不会因 Blade 报错的最硬证据)
- php artisan route:list:69 条路由正常,0 条残留 gallery/upgrade
- 70/70 jsdom 行为测试通过
- verify_repo.py 通过,并新增两条守卫:①设置页模板引用的变量必须由控制器传入;
②已移除功能的常量/配置项不得再被真代码引用。Dockerfile 里 config/convention.php、
routes/web.php 的 md5 自证同步为新值(这两个文件现在是有意偏离上游)。
- npm run prod 重建前端产物;context-js.js 两份仍字节一致(e114c840…,补丁未动)
|
2026-09-29 01:23:46 +08:00 |
|
mole404
|
880912239c
|
Merge branch 'ui/clean-minimal':前端换新(清爽极简 + 亮/暗/跟随系统)
分支构建(run 36452919350)全绿后才合并:jsdom 行为测试、镜像自证(补丁 md5 / 长按阈值 /
安装页 200)、代码同步与数据安全三场景全部通过;分支上 Promote 按设计跳过,latest 未被改动。
主要改动
- 设计令牌 + 组件层:resources/css/app.css、tailwind.config.js(颜色全走 CSS 变量,字体改系统栈)
- 三态主题:resources/js/stores/theme.js + components/theme-switch.blade.php + 首屏防闪内联脚本
- 布局与全部组件按新设计重排;27 个视图约 1000 处硬编码颜色换成令牌
- 第三方组件暗色皮肤(toastr / sweetalert2 / viewer.js)
- 修复:重建前端资源会把 context-js.js 压缩改名、破坏补丁自证(改为字节级拷贝)
- CI:镜像校验的补丁 md5 改为从 Dockerfile 解析;新增 workflow 变量引用自检
交互逻辑一行未改(长按菜单 / 点击防护 / 上传 / 选择 / 拖拽等)。
|
2026-09-29 00:45:23 +08:00 |
|
mole404
|
2ee1fd21e1
|
ci: 补全漏改的变量引用 + 给 workflow 加"未定义变量"自检(连红两轮的元凶)
- 「Verify code sync」步骤里还有 5 处引用已删除的 CONTEXT_JS_MD5 / BLADE_MD5 ——
它们会静默变成空串,导致该校验必然失败(bash -n 看不出来)
- 现在由「Verify published image」解析后写入 $GITHUB_ENV,后续步骤共用这两个值
- check_wf.py(本机校验脚本)新增检查:把 workflow 里 env:/赋值过的名字当已知变量,
扫出其余大写变量引用,防止这类"删了定义还有人在用"的假失败再次发生
|
2026-09-29 00:41:59 +08:00 |
|
mole404
|
6f3de25dca
|
ci: 镜像校验步骤的补丁 md5 改为从 Dockerfile 解析(消除第二处「事实的副本」)
背景:界面改造后 images.blade.php 的 md5 变了,Dockerfile 里两处都同步更新了,
但 workflow 的「Verify published image」步骤里还硬编码着旧的 f4e100c8 —— 镜像本身是对的
(构建期 md5sum -c 已断言),却被这一步判成失败而整轮变红。这与之前 LSKY_COMMIT 贴错 tag
是同一类病根:事实被抄了多份,改一处忘一处。
- 删掉 env 里的 CONTEXT_JS_MD5 / BLADE_MD5 常量,改为在校验步骤里
从 Dockerfile 的 .code-revision 生成段 grep 出期望值(单一事实来源)
- 解析不到就直接报错退出(避免"静默放过")
|
2026-09-29 00:38:33 +08:00 |
|
mole404
|
bf39ad4fd4
|
chore: 再移除一个提交信息临时文件(以后写到仓库外,不再入库)
|
2026-09-29 00:35:34 +08:00 |
|
mole404
|
bdb10c1683
|
fix(build): 前端资源重建不再破坏补丁自证(webpack 会压缩 mix.copy 过去的文件)
- webpack.mix.js:去掉 context-js 的 mix.copy —— --production 下 webpack 会对 copy 过去的文件做
压缩改名,public/js 里的补丁版会丢掉 isIOSWebKit / LONG_PRESS_DELAY = 250 / installMenuGuard /
MENU_OPEN_GRACE 这些标记,既让 Dockerfile 的补丁自证 grep 失败,又与 resources/js 不再字节一致
(CI 的「两份 context-js.js 内容一致」测试正是抓出这个问题的)
- 新增 scripts/copy-patched-assets.js,package.json 的 production 收尾调用它做字节级拷贝,
保证 public/js 与 resources/js 两份永远一模一样
- user/images.blade.php 的 md5 同步更新(界面改造后重算)
验证:npm run prod 通过;两份 context-js.js md5 均为 e114c840…(含全部补丁标记);
70/70 jsdom 行为测试通过;verify_repo.py 通过
|
2026-09-29 00:34:55 +08:00 |
|
mole404
|
84029b9d27
|
chore: 移除外泄的提交信息临时文件(构建无用,仓库根不留垃圾)
|
2026-09-29 00:33:05 +08:00 |
|
mole404
|
f20e2dbc6c
|
ui: 全站前端换新(清爽极简 + 亮/暗/跟随系统),交互逻辑零改动
设计系统
- resources/css/app.css:新增设计令牌(亮/暗两套 CSS 变量)+ 组件层
(ls-card / ls-btn / ls-input / ls-table / ls-nav-item / ls-menu …)
- tailwind.config.js:颜色指向令牌 —— 页面写 bg-surface / text-ink / border-line 即可,亮暗自动正确;
字体改为系统字体栈,去掉 Google Fonts 的 Nunito(国内慢、中文用不上)
主题
- resources/js/stores/theme.js:三态(跟随系统 / 亮 / 暗),存 localStorage,系统偏好变化时自动跟随
- layouts/app.blade.php + guest.blade.php:首屏内联脚本先给 <html> 加 .dark,避免暗色下闪白屏
- components/theme-switch.blade.php:外观切换控件(顶栏 + 登录页右上角)
页面
- 布局(sidebar / header / user-nav / notice / strategies / guest)与全部组件按新设计重排
- 27 个视图约 1000 处硬编码灰阶/蓝色 class 换成令牌;只动样式类,
id / data-* / Alpine 指令 / jQuery 钩子一律未动
- 第三方组件补暗色皮肤(toastr / sweetalert2 / viewer.js)
兼容与自证
- context-js.js(iOS 长按菜单)一行未改,md5 仍是 e114c840…
- images.blade.php 仅改样式类,md5 已在 Dockerfile 同步为 ec25ecc2…(?v=ios-longpress4 断言仍在)
- 70/70 jsdom 行为测试通过;verify_repo.py 通过;npm run prod 编译通过
- 构建资源请用 Node 18/20(Node 22+ 与 laravel-mix 6 不兼容)
|
2026-09-29 00:32:12 +08:00 |
|
mole404
|
e68476b715
|
deps: 镜像改用 composer install --no-dev(去掉 40 个开发包)+ 处理连带的包发现缓存
- 开发包(debugbar / ignition / whoops / phpunit / faker / sail / mockery / collision 等 40 个)
对线上没有用途:既占体积,也是暴露面(debugbar 那类在调试模式下会漏内部信息)
- 连带修复(这是关键,不然会 500):卷里的 bootstrap/cache/packages.php 是"当年装着开发包"时
生成的,记录了这些包的 ServiceProvider 类名。包没了之后 Laravel 引导时加载该清单会
Class not found → 整站 500。entrypoint 的同步分支现在会作废 packages.php / services.php
(两者都是纯缓存,下次请求会按当前 vendor/ 重新生成,删掉无副作用)
- CI 场景 B 新增回归:故意往卷里种一份引用 debugbar 的过期清单 → 断言同步后已被作废;
并新增断言"镜像里确实没有 vendor/phpunit | barryvdh | spatie/ignition | fakerphp"
- 新增 .github/workflows/retag.yaml:把某个 tag 重新指向**已存在**的镜像(用于修正历史贴错的 tag)。
安全闸:不允许 latest 当目标、源必须是 sha- 不可变 tag、打印改前/改后 digest
|
2026-09-28 23:48:54 +08:00 |
|
mole404
|
d298813708
|
fix(build): PHP 8.3 的官方镜像不再自带 ftp —— 两个阶段都显式安装,并加 CI 硬断言
换到 8.3 后构建失败的真因(CI 实测):php:8.1-cli/bookworm 自带 ftp 扩展,
php:8.3 的没有 → builder 阶段 composer install 校验平台要求时直接失败
(league/flysystem-ftp requires ext-ftp *)。
ftp 是 Lsky 的 FTP 存储驱动要用的扩展,不能依赖"从基镜像继承":
- builder 阶段:docker-php-ext-install ftp
- 运行时镜像:install-php-extensions 列表加 ftp
- CI 关键扩展硬断言列表加 ftp(以后基镜像再变也跑不掉)
|
2026-09-28 23:32:24 +08:00 |
|
mole404
|
b7dab283ed
|
deps: PHP 8.1 → 8.3,依赖升到同大版本线内最新(laravel 9.52.21 / symfony 6.4 LTS / 一批 CVE 修复)
理由:PHP 8.1 已于 2025-12-31 EOL,8.2 的 EOL 是 2026-12-31(都太近),8.3 支持到 2027-12-31。
- ARG PHP_VERSION 8.1 → 8.3(要回退就改这一行;但请连镜像 tag 一起回退,因为新 lock 里的包可能要求 ≥8.3)
- src/composer.lock 用 CI 里的定向求解重算(--prefer-stable + 显式钉版本):
laravel/framework v9.52.17 → v9.52.21(9.x 最后一个补丁)
symfony/* v6.0.x → v6.4 LTS(Laravel 9 的 ^6.0 正好允许;6.4 是 LTS,支持到 2027-11)
guzzle 7.9.2→7.15.5、psr7 2.7.0→2.13.1、phpseclib 3.0.43→3.0.57、
commonmark 2.6.0→2.10.3、aws-sdk-php 3.336.6→3.398.1、laminas-diactoros 2.25.2→2.26.0
合计 66 个包变化,已确认无 dev 分支版本混入
- composer.lock 因此不再等于上游值:Dockerfile 把它从「上游纯净性」挪到「有意偏离」组,
仍钉 md5(9dfc7d029808dbca37cc239560e8f49f)—— 任何改动不更新这里就会构建失败
- 重要背景:Composer 2.10 起默认「拒绝带未修安全公告的版本」,而整条 laravel/framework 9.x 线
都被 5 条公告覆盖 —— 所以重新解析依赖必须显式关闭该策略(CI 的 lock 任务里有开关 + 说明)。
这不新增风险:线上本来就跑在这条线上,只是把既有事实写明。Laravel 框架自身的公告
只有升级大版本(10/11/12)才能修,属于另立项的工程。
- README 新增「运行时版本与依赖」一节,把上面这些写成可查的记录
|
2026-09-28 23:29:57 +08:00 |
|
mole404
|
2c38a89296
|
ci: lock 任务改用 composer config --global(不碰仓库 composer.json,避免 content-hash 不一致)+ 加锁一致性校验
|
2026-09-28 23:24:34 +08:00 |
|
mole404
|
a56b3580ba
|
ci: lock 任务加显式开关 ignore_advisory_policy(调研发现 Composer 2.10 默认拒绝整条 Laravel 9 线的版本,不关掉无法重新解析依赖)
|
2026-09-28 23:12:19 +08:00 |
|
mole404
|
1d2f3c3574
|
ci: lock 任务加 --prefer-stable(Lsky 是 minimum-stability: dev,不钉版本会选到 9.x-dev 开发分支)与低版本 PHP 兼容探针
|
2026-09-28 23:11:12 +08:00 |
|
mole404
|
d173585d46
|
ci: 修 PHP 版本断言(报告里有多行以 PHP 开头,sed 抓到两条 → 必须 head -1)
上一次 a25f758 的构建失败就是这条测试器 bug:变量取成了 8.1\n8.1,于是
「镜像里的 PHP 版本与请求的不一致」误报。产品侧没问题(pin 断言那步是通过的)。
|
2026-09-28 23:09:15 +08:00 |
|
mole404
|
b6ec17df8e
|
ci: lock 任务加依赖冲突诊断 + 镜像自证 dump 已装扩展
- lock 任务:先跑 composer why-not php <ver> / check-platform-reqs,讲清「谁把 PHP 版本卡住了」;
裸 php:cli 没有 ext-ftp(生产镜像有 —— 否则镜像构建期 composer install 早就失败),求解时按平台要求忽略
- 镜像自证报告新增:.code-revision 内容、PHP 版本、已装扩展全量 dump
(供人工比对 composer.lock 里 ext-* 的要求,排查「声明要但镜像没装」的扩展)
|
2026-09-28 23:09:00 +08:00 |
|
mole404
|
d5908b62d4
|
ci: 试构建不提升 latest;新增 composer.lock 定向更新任务
- workflow_dispatch 指定 php_version ≠ Dockerfile 默认时判定为「试构建」:只发不可变 tag,
跳过 Promote 步骤,避免未定案的版本成为线上 docker compose pull 的目标
- 新增 update-composer-lock.yaml:在指定 PHP 版本的容器里对**指定包**跑 composer update
(--with-all-dependencies),composer.lock 作为 artifact 上传,不自动提交;
同时输出 composer audit 与升级前后版本对照,供人工确认(本机没有 php,只有这条路)
|
2026-09-28 23:07:12 +08:00 |
|
mole404
|
74bde44224
|
fix(boot): 空卷播种改用 tar;compose 与工具脚本的几处加固
- entrypoint 首启播种:cp -a /var/www/lsky/* → tar(cp 的通配符不带顶层点文件,
以后新增顶层点文件会静默漏掉;tar 与同步分支行为一致,仍排除 .env)
- 版本标记改为最后写(它同时是 CI 的「播种完成」信号,必须等文件都落盘)
- Dockerfile 的 entrypoint 静态断言同步更新
- docker-compose.yaml:去掉硬编码 root 密码的 mysql:5.7 示例,改为注释掉的正规模板
(密码取环境变量、镜像不用已 EOL 的 5.7),默认说明 SQLite
- tools/vendor-upstream.sh:擦除 src/ 前加安全闸(src/ 有未提交改动就中止,
这是唯一不可逆操作,避免把 src/ 下的自有改动静默抹掉)
- README:回滚 tag 警示(别用 :911275c… 这类历史 tag)、CI 试构建与迁移守卫说明
|
2026-09-28 23:06:37 +08:00 |
|
mole404
|
0fe22ac24c
|
ci: 上游 pin/PHP 版本改为从 Dockerfile 解析,修掉 tag 贴错
- env.LSKY_COMMIT 硬编码 911275c,Dockerfile 升到 38d52c46 后漂移:
promote 步骤把新镜像贴上了「旧快照」tag,用那个 tag 回滚会拿到新代码(真事故)
- 改为从 Dockerfile 解析 ARG LSKY_COMMIT / ARG PHP_VERSION(单一事实来源)
- 新增断言:镜像内 .code-revision 的 lsky_commit 必须 == Dockerfile pin;PHP 版本必须 == 本次请求
- 新增 UPSTREAM_MIGRATION_COUNT 守卫:上游迁移文件数变了就报红(entrypoint 不跑 migrate)
- concurrency 串行化(不打断在跑的构建),避免旧构建把 latest 覆盖回去
- 5 个 action 全部按 commit SHA 钉住(该作业有 packages: write)
- workflow_dispatch 增加 php_version 输入,可试构建验证版本兼容性(不改仓库默认值)
|
2026-09-28 23:06:37 +08:00 |
|
mole404
|
d7fed9a125
|
fix(build): 构建阶段补回 unzip(composer 解压 dist 包要用)
上一个提交里我把它当成"只有拉上游 archive 才需要"删掉了,结果 composer install
直接失败:"The zip extension and unzip/7z commands are both missing, skipping."
—— 现在源码是 vendored 的、不再解压 archive,但 composer 装依赖仍然需要它。顺手加 git,
给少数走 source 安装的包兜底。CI 已实测复现,这个提交后应恢复正常。
|
2026-09-28 22:38:10 +08:00 |
|
mole404
|
7c3188e25a
|
refactor(源码): 应用源码 vendored 进 src/ + 上游 pin 升级到 38d52c46(2025-11-24)
上一版是「钉死上游 commit、构建时拉 archive、再用 overlay/ 叠加补丁」。但上游已明示停止维护
(README 里 2024-12-28 起挂着警告:「开源版本已停止维护,不再进行新特性更新和 bug 修复」),
所以把源码放进本仓库:构建不再依赖 github.com/lsky-org 长期可用,之后要改 PHP 代码直接改
src/ 提交即可,不必再维护叠加机制。
1) 上游 pin:911275c(2023-05-16)→ 38d52c4609eb85236b45ac75acac2ced55174953(2025-11-24)。
中间 32 个提交只动了 9 个文件,**数据库迁移 0 处**,所以升级不碰站点数据(SQLite 结构不变)。
吃进三个真实修复:图片格式转换时不同图片共用同一个临时文件(并发上传会变成同一张图,
默认配置即触发)、加水印后丢质量参数、SVG 支持;另有 laravel 9.52.4→9.52.17、
phpseclib 3.0.19→3.0.43、commonmark 2.3.9→2.6.0、aws-sdk-php 等一串依赖安全升级。
2) vendored 源码:src/ = 上游 38d52c46 的完整树(304 个文件、8.1MB,按 commit 精确复制,
文件数与上游 git 树一致)。我们的三个补丁文件就地打上补丁,取消 overlay/。
3) Dockerfile:去掉 curl 下载 archive 那一层,改成 COPY src/;自证拆成两组 ——
「自证 1 上游纯净性」ImageService.php / convention.php / public/index.php / routes/web.php /
composer.lock 必须等于上游 md5;「自证 2 补丁产物」三个补丁文件 md5 + 关键标记 grep。
快照被误改、补丁丢了,构建期就拦下。
4) 新增维护脚本:tools/diff-vs-upstream.sh(拉上游快照做全树对比 + 白名单校验:除三个补丁文件
外不许有别的改动,同时可重生成 patches/ios-longpress.patch)、tools/vendor-upstream.sh
(换 pin 时重新 vendor,自动保留补丁文件并打印上游侧差异)。
5) 测试与文档:jsdom 测试默认路径改指 src/public/js/context-js/context-js.js,新增两条结构自检
(两份 context-js.js 必须一致、blade 必须带 ?v= 版本串)→ 70/70 通过;README 重写
「代码在仓库哪里、怎么改、怎么升 pin」,并修正许可证说明(应用 GPL-3.0 / 打包 AGPL-3.0)。
数据安全逻辑一字未动:entrypoint.sh 仍是「版本标记不一致才同步」,排除
.env / storage / database / bootstrap/cache / public/i。换镜像后容器自动把新代码同步进卷。
|
2026-09-28 22:36:48 +08:00 |
|
mole404
|
ffb7947d89
|
fix(menu): 菜单只要还在屏幕上就不许点穿(修掉 Windows 偶发点穿)+ 诊断转储
老师报:Windows 上偶尔“菜单还在显示时,点一下别的图片就透了”,直接开预览。
根因:拦不拦那一发点击只看内存状态 menuVisible,而外部滚动 / resize / Esc / 关菜单后的
100ms 淡出都会把它提前置 false。其中 scroll 恰恰很容易被“非用户操作”触发 —— 菜单是绝对定位
插进 body 的,**插入这个动作本身**就可能改变页面高度/滚动条、让浏览器自己滚动(滚动锚定、
图片懒加载重排、justified-gallery 重排)。于是“菜单刚打开就被自己引发的滚动关掉”,紧接着
元素淡出的那 100ms 里菜单看着还在、状态已经是关 —— 这时点别的图片就直通开预览。这也解释了
它为什么是“偶尔”:取决于菜单落在哪、要不要出滚动条、浏览器是否触发滚动锚定。
改法(仍然只改 overlay/context-js.js 一个文件):
1) 判据由 menuVisible 换成 menuOnScreen():状态打开 || 关菜单后的淡出窗口(fadeSpeed+50ms)
|| DOM 实测(.dropdown-context 存在且 getBoundingClientRect().height > 0)。
这样任何一条把状态提前置 false 的路径,都不再让“看得见的菜单”失去拦截能力 ——
“看得见就不许点穿”变成硬保证。
2) MENU_OPEN_IGNORE_INPUT = 300ms:菜单刚打开的 300ms 内忽略 scroll/resize/orientation
(这一段里的滚动多半是菜单插入自身引发的);过了之后用户滚动照旧关菜单。
3) 诊断:常驻环缓冲记录最近 240 条菜单事件(打开 / 关闭**原因** / 每次点击的判定),
暴露 context.debugDump()(控制台 copy(context.debugDump()) 即可导出);
context.debug = true 时实时打控制台。
验证:
- test/longpress.test.mjs 68/68 通过。新增 5 条回归:淡出期间点别的图片不许点穿、
状态已 false 但 DOM 实测菜单可见时仍要吞、菜单刚打开 300ms 内的自引发滚动不关菜单、
菜单彻底消失后点击恢复正常(不会一直吞)、debugDump() 含打开记录与关闭原因。
- test/repro-clickthrough.mjs 最小复现(新增):对旧版打印 ❌ 点穿、新版打印 ✅ —— RED→GREEN 证据。
- CI 镜像自证新增 MENU_OPEN_IGNORE_INPUT / menuOnScreen / debugDump 三个标记断言。
- blade 版本串提到 ?v=ios-longpress4(击穿 Safari 启发式缓存);Dockerfile 三处 md5 +
.code-revision 两行 + workflow 的 CONTEXT_JS_MD5/BLADE_MD5 全部同步;
patches/ios-longpress.patch 重新生成并验证可干净应用、结果与 overlay 字节一致。
|
2026-09-28 22:11:58 +08:00 |
|
mole404
|
260560997d
|
test(ci): 镜像自证的报告里补上 isMenuOpen(断言要求它但没 grep 出来,属观测遗漏)
上一轮 CI(36429019512):jsdom 行为测试 56/56 全过 ✅、镜像 md5/阈值/其余三个标记全过 ✅,
只有 isMenuOpen 这条断言失败 —— 容器内那份报告只 grep 了 MENU_OPEN_GRACE / installMenuGuard /
touch-open,没 grep isMenuOpen,于是断言列表里的 isMenuOpen 取不到值。补上 grep 即可。
|
2026-09-28 21:32:37 +08:00 |
|
mole404
|
5151eff2e2
|
feat(menu): 点菜单外只关菜单(不再点穿)+ 触摸端二级菜单点击展开 + 滚动/缩放/Esc 关闭
老师在 iPhone 上提的两个交互问题,根因都在上游 context-js.js 里:
1) 点菜单之外会点穿:上游关闭逻辑只在 document 的冒泡阶段 fadeOut,不 preventDefault
也不 stopPropagation → 点别的图片时"关菜单"和"开预览"同时发生(Viewer.js 的 click
挂在图片网格上);手机上想关菜单只能去点地址栏,而地址栏又窄又难点。
2) 手机上二级菜单一点就没:二级菜单是 CSS :hover 驱动的,手机没光标 —— 点"复制链接"
时浏览器补发的合成 mouseenter 让子菜单闪一下,紧接着那发 click 撞上关闭逻辑,整个
菜单消失 → 复制链接里的 Url/Html/BBCode/Markdown 在手机上根本点不到。
改法(只在 overlay/context-js.js 里,不动主题 CSS):
- 菜单守卫装到 document 的捕获阶段:菜单打开时点菜单外 → 关菜单 + preventDefault +
stopPropagation,事件永远到不了页面处理器;菜单内部点击照旧放行(复制/重命名/删除不变)。
- 手机上"手指按下"就收起来(更跟手),随后补发的 click 用 700ms 时间窗吞掉;
拦截只打在 click 上、不拦 touchstart → 滚动/缩放不受影响。
- 刚打开的保护窗 MENU_OPEN_GRACE=800ms,只对"紧随一次触摸的 click"生效(lastTouchAt),
鼠标点击不受影响:长按抬手补发的那发 click 只吞掉、不关菜单(否则菜单刚开就自己关)。
- 触摸设备(matchMedia('(hover: none)'))点带二级菜单的父项 → 加 touch-open 类 + 注入与
hover 等价的 CSS,点击展开/收起、同层只留一个;有鼠标的设备继续 hover(桌面零改动)。
- 滚动/旋转缩放(含 #images-scroll 内部滚动)、Esc 关菜单;菜单自身滚动不误关。
- 新增 context.isMenuOpen()(上游没有)供测试与诊断观测菜单状态。
测试:test/longpress.test.mjs 25 → 56 个用例,覆盖上述每条分支,含三条回归
(抬手 click 不能关掉刚开的菜单 / 点菜单外必须吞点击 / 菜单关后点击要恢复正常)。
CI 新增 Behavior tests (jsdom) 步骤(构建前跑,npm ci + npm test),
镜像自证新增 installMenuGuard / MENU_OPEN_GRACE / touch-open / isMenuOpen 标记断言
与"Apache 实际吐出的 JS md5"端到端断言。
配套:blade 版本串 ios-longpress2 → ios-longpress3(击穿 Safari 启发式缓存)、
所有哈希断言同步(Dockerfile 自证 2 + .code-revision + workflow env)、
patches/ios-longpress.patch 重新生成(已 git apply --check 验证能干净打回上游并逐字节一致)、
README/test-README 文档更新、新增 .gitignore 与 test/package-lock.json。
|
2026-09-28 21:29:45 +08:00 |
|
mole404
|
7ef392d154
|
ci: 只构建 linux/amd64(老师这台是 x86_64,arm64 白烧一半构建时间)
- workflow 的 platforms 从 linux/amd64,linux/arm64 改成 linux/amd64,
步骤名同步改;注释里写了要 arm64 时怎么改回来(只动 platforms 一行)
- README 的平台示例同步说明
- 顺带掐掉了正在跑的多架构那一轮(自证内容与新一轮相同,没必要等)
|
2026-09-28 20:06:54 +08:00 |
|
mole404
|
6d67510628
|
test(ci): 测速那段改用 bash(sh 里没有 time 内建,exit 127 挂掉了整步)
上一轮 CI(36417548147)三个场景全绿:
A/A2 空卷播种不带 .env、安装页 200 ✓
B 旧标记自动同步、.env(内容)/数据库/上传/配置缓存零丢失、视图缓存已清 ✓
C 同标记跳过同步、手动修补保留、Apache 实际吐出的 JS = 补丁版 md5 ✓
只剩最后一段纯信息量的「同步开销」探测:`time` 是 bash 内建,写成了
`--entrypoint sh -c '... time ...'` → sh: time: not found → exit 127 整步变红。
改成 --entrypoint bash,并加 || echo 容忍(它只是量体积/耗时,不该拦住 promote)。
|
2026-09-28 20:04:02 +08:00 |
|
mole404
|
a38125a435
|
test(ci): 修 C 场景的 apache 就绪竞态(curl 拿到空响应)+ 失败自动打诊断
上一轮 CI(36415910785)结果:A/A2/B 全过(空卷播种无 .env、安装页 200、
旧标记自动同步、三项数据哨兵零丢失、视图缓存已清),只剩 C 的最后一条:
SERVED_JS=d41d8cd98f00b204e9800998ecf8427e 是**空字符串的 md5** ——
`[lsky]` 日志行是在 exec apache 之前打的,我拿它当就绪信号,于是 curl 时
apache 还没起来,拿到空响应。改成轮询「Apache 实际吐出的 JS md5 对上」为止。
顺带给这步加了 ERR trap:失败时自动 tail 三个容器的日志,下次不用翻整个 run 日志。
|
2026-09-28 19:45:17 +08:00 |
|
mole404
|
20273fb5be
|
test(ci): 自证步骤的等待信号改成「分支最后写的东西」(修竞态假失败)
上一轮 CI(36414664596)挂在「空卷里没有版本标记」—— 又是断言/等待逻辑的问题,
不是应用问题:播种分支要拷 115MB 应用树,其中 index.php 在字母序里很早就拷完,
而我拿它当「播种完成」信号,于是 cp 还在跑的时候就去查版本标记(标记是分支最后
才拷的),必然查不到。
- 场景 A:完成信号改成盯 `.code-revision`(播种分支最后一个写入),轮询放宽到 120s
- 场景 B:完成信号改成盯日志行 `已同步进卷`(sync 的 tar 写完之后才 echo),
避免在 tar 还在写卷时断言读到中间状态;JS md5 断言保留为同步后的硬校验
|
2026-09-28 19:28:57 +08:00 |
|
mole404
|
0a321bf49b
|
test(ci): 修掉自证步骤里两处我自己写错的断言
上一轮 CI(36412934705)结果:镜像自证全过(补丁 md5、blade、250ms、扩展、
/install 200),同步自证挂在场景 A —— 但那是**我断言写错**,不是应用问题:
我在 `curl /install` 之后才检查 .env,而 Lsky 的安装向导自己会创建 .env,
所以拿到的是「向导生成的那份」。安装页返回 200 恰好说明 500 已经修好了。
1) 场景 A 拆成 A(播种阶段,未发任何请求时 .env 必须不存在)+ A2(安装页 200)。
检查 .env 时若存在还会打印它与 .env.example / 镜像内 .env 的 md5,一眼分辨
是「镜像泄漏」还是「向导生成」。
2) 去掉 ENV_MODE=640 断言:上游 entrypoint 自带 `chmod -R 755 /var/www/html/`,
会把 .env 权限位归一化成 755,与同步无关(.env 内容仍被严格断言未被覆盖)。
3) 轮询循环改成 if 形式(`cmd && break` 在 set -e 下虽不退出,但语义含糊)。
|
2026-09-28 19:16:17 +08:00 |
|
mole404
|
7ddb15b7bd
|
fix(sync): 改成「按镜像版本标记」条件同步,并修掉首启分支把 .env 带进空卷的 500
老师选定方案甲(按版本标记条件同步),并修掉上一次 CI 抓到的真问题。
1) 修 500(我上一次改动引入的):首启分支还原成与上游逐字一致
`cp -a /var/www/lsky/* /var/www/html/` + 单独拷 .env.example。
镜像是带 .env 的(构建时由 .env.example 生成、APP_KEY 为空),
上一版用 `cp -a /var/www/lsky/.` 把它带进了空卷,Lsky 安装向导撞上已存在的
空 .env 直接 500 —— 全新建站会挂。现在钉了构建期护栏:首启分支必须保持
`/*` 形态且必须拷 .env.example,否则构建失败。
2) 版本标记:build 阶段生成 .code-revision(fork sha + 源码 commit + 两个补丁 md5),
入口脚本比较镜像内与卷内这一份:
空卷 → 全量播种(并写上标记)
已有卷 + 标记不同 → 同步代码 + 清编译视图缓存(= 换了镜像)
已有卷 + 标记相同 → 跳过(不白写整棵应用树,手改保留)
排除清单不变:.env / storage / database / bootstrap/cache / public/i 一律不碰。
附带好处:回滚也变成「换一行 image」—— 旧镜像标记不同会自动把代码同步回去。
3) CI 自证重写为三个真实 docker 场景(不过就不 promote latest):
A) 空卷:安装页 200 + 卷里必须没有 .env(钉住上面那个 500 的根因)
B) 已有卷 + 旧标记:代码被同步、.env(含权限位)/数据库/上传/config 缓存一项不被碰、视图缓存已清
C) 已有卷 + 同标记:跳过同步、手动修补保留、对外服务的 JS 仍是补丁版
本地自证:入口脚本三分支仿真 15/15、jsdom 行为测试 25/25、
Dockerfile 全部构建期断言 grep 命中、workflow 三个 run 脚本 bash/sh -n 通过。
|
2026-09-28 18:59:14 +08:00 |
|
mole404
|
90e151eef0
|
feat: 长按阈值 500→250ms;入口脚本改为每次启动强制同步代码进已有卷
老师的两个要求:
1) 长按 0.5s 偏长 → LONG_PRESS_DELAY 减半到 250ms。
- 配套保留「手指移动 >10px 即取消」,用来抵消阈值变短带来的误触风险
- blade 的资源版本串递增为 ?v=ios-longpress2,击穿 Safari 的启发式缓存
(否则老浏览器还在用 500ms 那份 JS)
- test/ 增加两个阈值回归用例(320ms 必须触发、160ms 必须不触发)
2) 升级不再需要人工 cp 文件:entrypoint.sh 在「已有部署」分支里每次启动都把
镜像代码同步进卷(tar 覆盖式),并自动清掉编译视图缓存。
- 绝不覆盖:.env / database/(SQLite)/ storage/(上传·日志·会话)/
bootstrap/cache/ / public/i —— 这五项是站点数据与配置,不是镜像代码
- Dockerfile 增加静态护栏:排除清单少一项就构建失败
- CI 新增「Verify forced code sync」步骤:模拟已有部署的卷(塞旧代码 +
.env/数据库/上传/编译缓存的哨兵文件),断言代码被更新、数据一项没被碰;
不过就 exit 1,不会 promote 到 latest
- README 重写升级/回滚章节并写明代价:手工改卷里的代码会失效、回滚必须连镜像一起回滚
自证:本地仿真 9/9(代码更新 + 五项数据保全)、jsdom 行为测试 25/25、
patch 能干净打到上游 911275c、Dockerfile 全部断言 grep 命中。
|
2026-09-28 18:24:08 +08:00 |
|
mole404
|
9f077ff974
|
ci: promote 步去掉 head 管道(SIGPIPE 让整步 exit 255),并补 php -m 分段行号诊断
|
2026-09-28 17:41:33 +08:00 |
|