老师反馈两点:① 反向切换(图都已加载完)时仍有时带过渡、有时不带;② 想要保留过渡
动画,"直接闪出来"效果差。复核后定位到两条:
· 上一版的 1 秒兜底定时器:慢图(>1s 才加载完)会在库读 options.transition 之前先被
恢复,于是过渡又生效 —— 这是"有时有动画"的来源之一。
· 上一版还有一把锁:只有上一次已恢复(saved === null)时才去关过渡。若 1 秒内连续切
(或 viewed 未到),这一次就不关 ⇒ 又带过渡。两条叠加就表现为"忽有忽无"。
既然老师要动画,方向改为"保留库自带的过渡,把起点钉死":
库每切一张新建 <img>,刚插入时用默认 CSS(满宽、贴顶);加载完成后才写内联样式:先写成
"屏幕中心的一个点",再写最终尺寸,靠 CSS 过渡补间。过渡起点 = 浏览器上一次渲染过的样式,
哪一帧被渲染由缓存/网速/主线程决定 —— 渲染到"满宽贴顶"那帧就会从上方飞入。
对策(不动库任何逻辑):用 :not([style]) 只命中"还没有内联样式"的那一瞬,把这一瞬做成
屏幕中心的小点。库一写内联样式该规则立即失效,因此绝不影响最终显示,也不会与库打架;
过渡仍是库自带的,所以动画完整保留。
本次移除上一版"临时关 options.transition"的整段补丁。
本机验收:9 套 jsdom 守卫测试全绿;浏览器六项全过(拖动跟手+回弹、横划 120px 切、
竖划不切、中途不翻页、捏合 351→1615、双击 1615→2751、切图后不误关);
飞入专项按 Claude 的延迟加载法执行;最终显示核对(宽度非 1px、opacity=1、已写内联样式)。
注:本机模拟环境复现不出真机那个飞入,最终以真机为准。
过程记录:本轮先被守卫拦下一次(把 CSS 误放进 <script> 块,测试会把 script 内容当 JS 跑),
已挪到 <style> 块并重跑,未影响线上。
基于 Lsky Pro 开源版大幅改动,全面面向个人自用优化,但仍保留多用户支持。
支持从上游开源版 Lsky-Pro V2.1 无损升级。
适配 iOS 长按菜单,交互优化,UI 全面焕新,适配亮色/暗色模式,升级 PHP 8.3 依赖,新增图片标签功能。
去除画廊功能,去除图片公开/私有权限设置,转为强制私有权限,多个用户不再支持通过画廊互相查看公开图片。
这是自维护镜像(非官方)。由于上游开源版停更,应用源码 vendored 在本仓库
src/里,构建不联网拉上游。
本仓库镜像地址:ghcr.io/mole404/lsky-pro-docker:latest
特性
- 全平台适配:兼容所有平台浏览器,修复上游开源版无法在 iOS 长按的问题,优化交互。
- 开箱即用:默认用 SQLite,不需要额外跑一个数据库服务;容器首次部署后浏览器打开就是安装向导。
- 低配友好:默认 Web 服务并发参数专为低配服务器优化,参数都可以通过环境变量单项覆盖。
- 安全加固:登录/注册等认证接口增加限流,不采信客户端伪造的转发头,移除了 SVG 上传,并淘汰了一批带 CVE 的依赖。
- 界面清爽:整套前端 UI 重做,简洁风格 + 亮色/暗色/跟随系统。深度优化手机端查看图片的手势操作体验。
- 图库功能:支持图片标签 —— 给单张或多张图片打标、在图片墙上按标签筛选、卡片上直接显示标签;标签按用户隔离,互相不可见。
快速开始
Docker Compose(推荐):
services:
lsky-pro:
image: ghcr.io/mole404/lsky-pro-docker:latest
container_name: lsky-pro
restart: unless-stopped
ports:
- "127.0.0.1:8089:8089" # 宿主端口:容器端口(WEB_PORT)
volumes:
- $PWD/lsky-pro/data:/var/www/html # 站点数据全在这个目录里($PWD = 你执行 compose 时所在的目录)
environment:
- WEB_PORT=8089
或使用等价的 docker run:
docker run -d --name lsky-pro --restart unless-stopped \
-p 127.0.0.1:8089:8089 \
-v "$PWD/lsky-pro/data:/var/www/html" \
-e WEB_PORT=8089 \
ghcr.io/mole404/lsky-pro-docker:latest
容器挂载卷路径可按你的实际情况改(上例是 $PWD/lsky-pro/data,$PWD 就是你执行命令时所在目录)。
上面把端口只绑到 127.0.0.1:生产环境推荐这样,再在前面放一层 Nginx 反代来终结 TLS,容器本身不用直接对外。
全新安装
- 容器首次部署后访问
http://<主机>:8089/,会自动跳到安装向导,更推荐设置反代访问 - 按向导填写数据库(默认 SQLite,路径可留空)与管理员账号密码
- 安装完成,开始使用
正在使用开源版 Lsky-Pro V2.1? 从上游开源版无损升级
- docker stop 旧容器名(如 lsky-pro)
- 完整备份数据目录(必做,别嫌麻烦)
- docker rm 旧容器名(如 lsky-pro)
- 根据旧版容器数据挂载路径,编辑新容器挂载卷路径,新版与上游旧版读取路径完全相同,务必确保挂载卷与旧版容器一致,挂载错误进去会报 500(数据不会丢,只是读取失败)
- 容器挂载卷路径设置正确后,拉取本仓库镜像部署即可完成升级
常见配置
端口
| 环境变量 | 默认值 | 说明 |
|---|---|---|
WEB_PORT |
8089 |
容器内 Web 服务的 HTTP 端口 |
HTTPS_PORT |
8088 |
容器内 HTTPS 端口(自签证书,仅供内网调试,一般不需要设) |
自签证书不随镜像发放、也不进数据卷:每个容器首次启动自己生成。想用自己的证书,把 .crt / .key 挂到容器内 /etc/apache2/ssl/lsky-selfsigned.crt 与 .key 覆盖即可。
并发与内存
镜像默认内置一套面向小内存单用户的参数。每一项都能用环境变量单独覆盖:
| 环境变量 | 默认值 | 说明 |
|---|---|---|
APACHE_START_SERVERS |
2 |
启动时预建的子进程数 |
APACHE_MIN_SPARE_SERVERS |
1 |
空闲子进程下限 |
APACHE_MAX_SPARE_SERVERS |
3 |
空闲子进程上限 |
APACHE_MAX_REQUEST_WORKERS |
5 |
并发请求上限(内存占用的主要来源) |
APACHE_MAX_CONNECTIONS_PER_CHILD |
5 |
单个子进程处理多少个请求后回收(0 = 永不回收) |
APACHE_KEEP_ALIVE |
Off |
只接受 On / Off;Off 最省内存 |
如果您不知道这些参数起什么作用,请不要随意修改,否则有爆内存风险。
面向个人自用以上参数保持默认值即可,多用户场景下可增大。
关于这个仓库
-
src/是 vendored 的上游应用源码(上游已声明停止维护),本仓库在自己的分支上做了维护性修改与功能补充。 -
相对上游改了哪些文件、为什么改,全部登记在一份清单里,可随时自查:
bash tools/diff-vs-upstream.sh它会把仓库里的
src/与上游快照逐文件对比,并校验所有偏差都落在"已知偏离清单"内 —— 只要它不报错,改动就恰好是清单里那些。 -
标签数据自检(只读,检查有没有残留的关联行):
docker cp tools/check-tag-integrity.php lsky-pro:/tmp/ docker exec lsky-pro php /tmp/check-tag-integrity.php -
本地测试:
cd test && npm test(用 jsdom + 真实 jQuery 跑图片页的交互路径)。 -
patches/里是一份"给人看的"补丁存档(不参与构建 —— 构建用的就是src/里的文件)。
许可与致谢
- 应用本体:lsky-org/lsky-pro(GPL-3.0);
src/保留上游的LICENSE与全部署名。 - Docker 打包:fork 自 HalcyonAzure/lsky-pro-docker(AGPL-3.0),本仓库自身的打包脚本沿用该许可。
非官方镜像,自用为主
使用前请自行判断是否符合你的需求与合规要求
如果有其他需求,请自行 Fork 修改,本人不提供维护保障,不保证处理 issue 和 PR