1.14.0 20261101 更新

云文件

1. 修好了「服务器上存的和前端显示的不一样」:新增一层按磁盘实际位置定位的逻辑,目录以磁盘为准,不再只看记录里写的父级。根目录那批「10.25 4:00」的文件删掉又自己回来、/test/1/ 明明有文件却显示为空、把同名文件夹移过去提示「移动了 0 个文件」,这几个现象是同一个根因,一起没了。

2. 一致性自检重写:改名漂移先修正,再扫磁盘、按「目录里实际装着谁的文件」认领记录、缺记录的按磁盘补、最后把父级和文件归位。两个同名目录不会再互相张冠李戴,真正的文件也不会被挂到错的文件夹下。

3. 删除、移动、重命名、批量操作、下载、分享全部改成按真实路径定位,删掉就是删掉,重启后自检也不会把它「补」回来。

4. 新增两个维护接口:GET /api/bbs/files/maintenance/health 出一份「记录与磁盘对不上」的对账单,POST /api/bbs/files/maintenance/reconcile 立即跑一次校验,不用等重启。

5. 全站的大文件上传都改成分片(默认 1MB 起):云文件(含打包上传)、网站根目录上传、源码 ZIP、数据恢复、论坛导入,都不再一个请求塞完。每片独立超时,20 秒没有进展就判死重传,最多重试 5 次(间隔逐次拉长),断线后从已传的字节继续,不再卡在 100% 或 40% 一动不动。

6. 分片大小会按实测速度自动调整:网速快的时候一片最大 8MB(同样的文件少跑几趟),慢或出错就自动缩到 256KB(一次别亏太多),不再固定 1MB。

7. 上传任务里会显示实时速度、预计剩余时间和当前正在用的分片大小,进度条不再是唯一的信息。

8. 断点续传:上传中刷新页面或网络断掉,重新选同一个文件会接着传,已经传过的部分不重来;服务端会把每一片的进度记下来,前端先问「传到哪了」再继续。

9. 最后一片的响应丢了也不会重复:重发最后一片会直接拿回上一轮的结果,不会多出一份「文件 (1)」。

10. 修好了单文件下载 500:之前下载单个文件必报「服务器内部错误」,文件夹打包下载却正常;原因是读取记录的那一步只在文件夹分支里做了。

11. 单文件夹上限从 128 改成 1024。提示也改准了:以前拿「这次一共选了多少个文件」去和上限比,现在只数这一层真正要放进去的条目,超了会点名是哪个文件夹、已有多少个、上限多少个;子文件夹里再多也不算这一层。

12. 每天 04:00(自动拉取文件任务之前)跑一次目录校验,不再只在重启服务器时校验。

13. server.py 重构成只管两件事的监督进程:更新和异常恢复。业务逻辑全在 app.py,app.py 起不来时由它接管端口返回 503 异常页(带当前版本、失败原因和进程报错、重试次数,5 秒自动刷新),后台按退避节奏重新拉起,恢复后自动关掉异常页。

14. 应用更新前只检查一件事:新版本里的 server.py 语法是否正常(跑不起来会把整个站点带下线,而且没法自动恢复)。不通过就整包拒绝——代码、数据、.autorun 全部保持原样,只记下「哪个版本、为什么被拒」,等 GitHub 上有更新的提交后自动重试;app.py 不做预先检查,也不会被悄悄换回旧版本。

15. server.py 自己被更新时热重启:在同一个窗口里交接,新进程接管端口后旧进程才退出,输出接着往下打;交接失败会自动回退,端口不会长时间没人管。

16. 切换进程时端口不再出现空窗:监听 socket 由监督进程长期持有,异常页和 app.py 交替使用同一个 socket,中间那几秒连接只是排队等一会儿,不会再变成「503 默认界面」或者连接被拒。

17. 异常页上的「拉取更新」显示的是真实次数(不会每次都写「第 1 次」);页面上还能直接下载完整的 .server.log,密钥 lcj100219。

18. 控制台的 AutoUpdate 状态固定成三行:当前运行版本、GitHub 远程最新版本、最新检查时间(都带 [UTC+8] 和短 SHA)。被拒绝的更新显示成 AutoUpdate [异常] 并附一句说明;自动更新暂停时显示 AutoUpdate [暂停],但仍然会查询并显示 GitHub 上的最新版本,只是不下载、不应用。

19. 启动横幅恢复成可以点的链接(监听 0.0.0.0 时显示 localhost),本地测试点一下就能打开。

20. 首页标题统一为「Origin Base」。