智汇摄影ZHIHUI PHOTO
CHANGELOG / 更新日志

这个站点是怎么长出来的。

每一次改动都写在这里,包括改坏了又改回去的那些。

2.4.0 2026.11.12 新功能

广场能排热榜,命题赛真的排名次

这一版没有加新页面,把「摆在那儿、但其实没接上」的几件事接完了。

  • 广场能排了:最新 / 最热 / 最多看 / 随手翻,四个排序一个下拉切换;还能按「机身」筛,点一台机器就只看它拍的。
  • 首页那六格不再永远是最新六张,改由编辑挑;作品页底部多了「接着看」——上一张、下一张,和同命题、同作者的推荐。
  • 能关注人了。作者页顶部有「关注」,关注之后他发新片会进你的消息,「我的人」标签页是一条按时间排的流。
  • 评论可以回了:楼中楼、@ 人、删掉自己那条。
  • 命题赛真的排名次了:投稿时能选参加哪一期,命题页出一个「当前榜单」,赞数就是票数;截稿后编辑在后台勾奖项,作品页挂奖牌。
  • 活动能签到了:组织者在活动页看到报名名单,点一下签到;活动结束后可以把当天的相册挂上去。
  • 订阅:/subscribe/ 邮件订阅 + 作品广场、专题、整站三条 RSS,页头自动发现。
  • 水印真的打上了。以前只有装了 Imagick 的机器才会打标,我们这台没有,所以一直没打。现在改用 GD 直接写字,开关打开后,之后上传的每张图右下角都带一行小字。
  • 邀请码签发上限从 500 收到 50、默认 5;列表多一列台账,能看出哪张码的用量对不上明细。
2.3.0 2026.11.10 新功能

大图自动压到 6MB,拍摄参数自己就填好了

手机直出的照片动辄十几兆,以前要么上传失败,要么自己找软件压。现在不用了。

  • 单张超过 6MB 的照片,在你点提交的那一刻于浏览器里压到 6MB 以内再上传,画质按「长边 3200 起、质量逐级降」自动取舍;没超标的图原样上传,一下都不动。
  • 拍摄参数默认公开,并且自己从照片里读:机身、镜头、光圈、快门、ISO、焦距,能读到的直接填进投稿表单;你手填的值不会被覆盖。
  • 参数存在作品页的独立区块里,末尾还带上拍摄时间。不想公开就在投稿时取消勾选,作品页会写「拍摄参数未公开」。
  • 投稿须知、约拍、头像三处都接了压缩;头像上限 2MB,超过也自动压。
2.2.4 2026.11.9 安全

联系方式取号加了每日上限

顺手把暴露面又摸了一遍,修掉 5 处。

  • 取号(点开作品看作者联系方式)现在每天最多 20 条,同一条作品当天重复看不重复计数。原先一个会员账号循环刷作品 ID,一秒就能把全部 78 条作品的号码扒走。
  • PNG 图片也洗掉 EXIF —— 以前只洗 JPEG/TIFF/WebP,与「图片洗掉 EXIF」的承诺不符。
  • 游客再也摸不到 /author/ 作者页(那里直接写着作者真名)。
  • 搜索框结果补了二次转义,评论与约拍的联系方式不再当 HTML 解析。
2.2.3 2026.11.9 优化

输错密码只锁自己,不再连累同一个校园网

以前按 IP 锁,宿舍或图书馆一个出口下的同学会互相连坐。

  • 同一出口 + 同一账号,10 分钟错 5 次才锁这个账号,锁 10 分钟。
  • 同一出口不管用户名,10 分钟错 30 次才锁整个出口,兜住换用户名爆破。
  • 提示文案分清「账号被锁」和「网络被锁」:前者建议找管理员重置,后者建议换网络或等十分钟。
2.2.2 2026.11.9 修复

手机上价目表不用横滑了

两处小修,没动数据。

  • 暗房价目表在 390px 宽的手机上原本 638px,最右边的「参考价」要横滑才看得见;现在四列全部在首屏。
  • 约拍发布加了 60 秒限频,防止脚本刷版。
  • 登录错误只统一「账号或密码不对」这类凭据错误,「账号已停用」不再被吞掉。
2.2.1 2026.11.8 安全

登录页不再帮你问出「这个账号存不存在」

信息泄露修复,功能与外观零变化。

  • 登录失败一律回同一句话,不再区分「用户不存在」和「密码错」。
  • 游客访问 /wp-json/wp/v2/users 现在 404,此前能一次拿到 16 个账号的 id 与昵称。
  • 注册时不再提示「该邮箱已注册」。
2.2.0 2026.11.8 优化

图片换成 WebP,首页快了一个数量级

本轮最大的一次性能改造,图片体积和首屏时间一起降。

  • 每张图自动生成 WebP 副本与多档尺寸(240 / 480 / 900 / 原图),浏览器按屏幕自己挑;不支持的浏览器照旧走 JPG。
  • 395 张附件、3150 个 WebP:JPG 共 298MB,压到 186MB,省 37.7%。手机上一张卡片图从 91KB 变成 22KB。
  • 首页与作品广场加了整页缓存:首页首字节 72.9ms → 6.4ms,作品广场 63.8ms → 5.9ms。
  • 顺带清掉 102MB 早已没人引用的旧站素材。
2.1.4 2026.11.8 修复

全站对比度审计,两套主题都过线

把「看不清」这类问题一次性量完。

  • 遍历 5 个页面所有带文字的元素,逐层合成背景色算对比度,浅色与深色各跑一遍,0 处低于 WCAG 标准。
  • 「加入我们」小标在深底上之前只有 4.48:1(12px 等宽字需要 4.5),现在 5.5:1。
2.1.3 2026.11.8 优化

知识库整块下线

一个没人用的模块,从页面到后台到搜索全部拿掉。

  • /knowledge/ 与 /k// 已经 404,后台不再出现「知识库」菜单。
  • 搜索框占位改成「搜索作品、活动、约拍」。
  • 顺手修了浅色主题下「加入我们」区块按钮看不见的问题。
2.1.2 2026.11.8 修复

深色模式不再黑底黑字

页脚和「加入我们」区块在深色模式下整体反了色。

  • 这两块改用不随主题翻转的固定反色,深色下页脚文字对比度 16.3:1、浅色 14.9:1。
  • 按 WordPress 规范把 212 行的 functions.php 拆成 setup / assets / perf / helpers 几个文件。
2.1.1 2026.11.8 优化

手机上看着歪的地方都扶正了

一批和「对齐」有关的修。

  • 顶栏收敛成六项:主页 / 作品 / 约拍 / 活动 / 暗房 / 团队,更新日志与贡献名单退回页脚。
  • 登录、注册、投稿页在手机上左栏曾被压到 151px,现在铺满 362px;输入框 16px,iOS 不再自动放大。
  • 团队照片一律彩色,人像统一 4:5 且焦点上移,不再裁掉脸。
2.1.0 2026.11.8 优化

首页只留真的数字

这一版按「页面该少什么」来改。

  • 首页去掉「120+ 卷冲印」这类虚数,统计条只留在展作品 / 注册会员 / 成立年份。
  • 删掉 Departments 整段;页脚收成单行。
  • 暗房页整页重写并对齐旧站:负责人微信 + 复制按钮 → 价目速览 → 怎么送卷 → 完整价目 → 样片 → 送片须知。
  • 新增 develop_sample 类型,样片可以在后台自己换。
2.0.1 2026.11.7 新功能 置顶

头像、大图灯箱、被驳回可以改

补上三处用得到的东西。

  • 个人中心可以上传头像了,JPG / PNG / WebP、2MB 以内,五分钟换一次;评论、作者页、后台统一显示
  • 作品大图点开就是全屏灯箱,Esc 或点空白处关掉,缩略图也能直接放大
  • 被驳回的投稿现在能自己改标题和说明后重新提交,直接回到待审核队列
  • 顺手修掉:重新提交后状态卡在草稿(后台待审核看不到)、摄影师主页把角色名印成 Array
2.0.0 2026.11.7 新功能 置顶

整站重写成 WordPress

同一套功能,换了个地基:从单个 Node 进程搬到 WordPress,数据一条没丢。

  • 78 件作品、239 条知识库、44 篇更新日志、394 张图片全部迁移完成,旧密码继续能用
  • 作品广场、独立作品页、摄影师主页、约拍、活动报名、每周命题、暗房价目、知识库全部重建
  • 新增:每周命题(/theme/)、个人主页 /u/、二维码 /qr/、装到桌面 /install/、离线页
  • 后台 11 个面板:概览 / 待审核 / 评论 / 举报 / 反馈 / 报名 / 用户 / 邀请码 / 访问日志 / 日志 / 设置
  • 图片上传自动抹掉 EXIF、可加水印、原图下载按权限放行
  • 反爬、访问日志、每日备份、站点地图、PWA 全部带过来了
1.34.1 2026.11.6 修复

保存提示挪到底部,关于文本单独一页

后台保存完不用再滚回顶部找提示;站点设置里那一段「关于我们」拆成内容组的独立页面。

  • 保存成功的提示从页面顶部挪到视口底部,点完保存就在按钮下方看得见
  • 站点设置和关于文本的保存按钮旁边都多了一行「已保存 · 21:34:02」,8 秒后自动淡出
  • 「关于我们」九组文本字段从站点设置拆出,内容组新增「关于文本」面板,深链 /admin?panel=about 可直达
  • 两个表单共用同一个写接口,只提交各自字段,互不清空对方
  • 操作日志里的详情会区分「站点设置」和「关于文本」
  • 切面板时自动收掉上一条保存提示,不再残影
1.34.0 2026.11.6 修复

后台侧栏按用途分组,日志不再排成一长条

后台原来 18 个面板平铺成一列,找「操作日志」得先往下滚。这次按用途收成 5 组,点哪组开哪组,记住你上次停在哪;顺带修了几处「点了没反应」和「装了 PWA 却永远看不到更新」的老毛病。

  • 后台侧栏从 18 项平铺改成 5 组折叠:概览 / 内容 / 成员 / 记录 / 设置,点开哪组就只看哪组
  • 打开的组会被记住,下次进来还是你上次看的那一块;待审、举报、反馈的红点汇总到组头上,收起也看得见
  • 手机上的后台:分组自动摊平成可横滑的一排,少点两下才能切面板
  • 当前面板写进地址栏(?panel=access 这种),刷新、收藏、转发都能落到同一页,不用每次从概览点过去
  • 反馈通知的链接以前点了只会打开概览,现在直接落到「反馈」面板;旧消息里的 /admin#feedback 也认得
  • 装在桌面上的 PWA 用户以前永远拿不到前端更新——Service Worker 把样式和脚本永久钉在旧版本;改成按带版本号的地址精确缓存,换版即生效
  • 会话过期不再只回一句「请先登录」:页面上的登录态会一起清掉,并说清楚是「登录状态已过期」
  • 反爬调轻:脚本 UA 第一次只回 403 不封禁,十分钟内再犯才封;公司网络、隧道这类共享出口不会再因为一个人被抓、整段 IP 被关两小时
  • scripts/add-superadmin.mjs 的引号嵌套语法错修掉(建超管脚本以前根本跑不起来)
1.33.0 2026.11.6 新功能

宣传二维码:扫到就进首页,中间不落任何页面

做宣传物料最容易被做成「扫码 → 落地页 → 点继续 → 首页」,这一层这次直接不要:二维码里放的就是站点根,扫到即打开首页。生成器长在站内 /qr,配色、静区、尺寸、来源标记都能调,PNG / SVG 随手下,还能直接打印一张 A4 海报。

  • 新增 /qr:左边预览、右边调参数,改一个字二维码立刻重画,不用等提交
  • 二维码由站点自己算(lib/qr.js,零依赖,版本 1–10、M 级纠错),内容不出本机,也不依赖任何第三方生成接口
  • 配色三套:墨黑 / 蓝晒 / 反白;静区 2 / 4 / 6 模块可选,默认按标准的 4
  • 下载 PNG(800 / 1200 / 2000 像素)或 SVG——印刷店要矢量,公众号和 PPT 要 PNG
  • 来源标记(海报 / 展板 / 名片 / 公众号)会以 ?from=xxx 追加到地址后面,进访问日志,后台能分开看各批物料到底被扫了多少次
  • 「打印海报」直接调浏览器打印:A4 竖版,标题、二维码、地址、格言都排好了,不用另开设计软件
  • 页面上写清了印刷的坑:成品不小于 25mm、静区别裁、别加圆角渐变、反白只能用哑光纸
1.30.1 2026.11.6 修复

服务不再每十分钟给自己重启一次

站点的防护插件会把「脚本客户端」拦掉,而服务器自己的健康探针正好是用 curl 发的——探针被自家 403,看门狗以为站点挂了,两天里重启了 316 次。这次把「自家探针」从外站脚本里摘出来,探针也换了正常 UA。

  • 本机反代进来的自检请求(X-Forwarded-For 全是回环)不再按外站脚本处理,健康探针、部署验收脚本都不会被自家防护拦
  • 看门狗换了判断:连续两次直连不通才重启服务;只有反代不通就 reload nginx,别拿重启当万能药
  • 日志里那句「这个地址暂时不能访问」不会再出现——它曾经把运维自己也挡在门外
  • 外站脚本抓取照旧 403,站外 curl 实测仍然被拦
1.30.0 2026.11.4 新功能

活动报名:后台挑身份,名单一眼看完

首页那条活动带现在能直接报名了。每个活动自己决定「谁可以报」——会员、模特部、暗房管理员、管理员,或者干脆谁都能填;后台能看到名单、逐条通过或驳回,还能导成表格。

  • 活动卡上多了「报名」按钮,点开填姓名、联系方式、备注,一屏填完
  • 每个活动单独设可报名身份:会员 / 模特部 / 暗房管理员 / 管理员 / 未登录访客,勾哪几个就只有哪几个能报
  • 可以设名额上限、报名截止时间,也能选「报名后要审核」——默认直接通过
  • 报名成功给本人发站内通知;需要审核的,通过或驳回都会再通知一次并说明原因
  • 后台活动面板多了「报名 N」按钮:按待审核 / 已通过 / 没通过筛选、按名字或联系方式搜、逐条通过或驳回、手动替谁登记一条、导出 CSV
  • 账号页多了一栏「我的报名」,报名状态和活动时间地点都在里面,还能一键取消
1.29.1 2026.11.4 优化

照片没出来会自己救一次,主屏图标也补上了

把「照片加载错误」拆成两种真事:一是图床的防盗链白名单没算上所有访问域名,二是缩略图或处理参数单张失败就直接空白。前者从源头放开,后者改成逐级回退,最差也画出一张占位。

  • 图床防盗链白名单改成覆盖 *zcstzhihui*(.icu、eu.cc 及以后的新域名都算自家),外站盗链依旧 403
  • 单张图坏了不再直接空白:先去 OSS 处理参数拿原图,再去掉 -t 缩略图后缀拿原图,最后画一张「这一格没冲出来」的占位
  • 这套兜底是全局的,作品墙、个人主页、团队页、抽屉大图一并生效,不用逐页改模板
  • iOS 主屏图标换成真正的 PNG(180/167/152 三档,深色底 + 光圈),根目录 /apple-touch-icon.png 与 /apple-touch-icon-precomposed.png 也补上了
  • 以前用的是 SVG 图标,iOS 不认,加到主屏幕只会显示网页截图——现在装完是正经图标
  • 离线缓存版本跟着提到 v1292,装过桌面的设备下次打开会自动换新壳
1.29.0 2026.11.3 新功能

装到桌面:iPhone、安卓、电脑都能加

整站做成了可以「添加到桌面」的样子:装完是独立窗口、没有地址栏,第二次打开先出上次的页面;同时给弱设备、弱网络加了一套自动降级。

  • 三种加法都写清了:iOS 走 Safari 分享菜单「添加到主屏幕」,安卓 Chrome 点「安装应用」,电脑 Chrome / Edge 点地址栏右侧的安装图标
  • 三个入口:/install 说明页、页脚安装条(关掉后 14 天不再弹)、导航栏「安装」按钮(浏览器允许一键安装时才出现)
  • 装完是独立窗口:桌面有图标、打开没有地址栏,直接就是作品墙
  • 页面壳存在手机里:第二次打开先显示上次的页面,网络慢也不白屏;真断网时给一页「这一格是空白底片」和重试按钮
  • 弱设备自动降级:CPU 只有一两个核、开了省流量、或网络是 2G/3G 时,关掉纸纹、毛玻璃和入场动画,图片只发 420 宽
  • 想手动切换就在地址后加 ?perf=low 或 ?perf=high;系统开了「减少动态效果」也会自动降级
  • 安装用的脚本按需加载:首屏不为它多背 7KB,真点了安装才拉下来
1.28.4 2026.11.2 优化

让这台 2 核 2G 跑得更快一点

从浏览器到 nginx 到 Node 到 SQLite 逐层过了一遍,把能省的一次省掉:首页首屏从 204ms 降到 72ms,接口命中缓存后压测从 1616 rps 涨到 3616 rps。

  • nginx 给 Node 开长连接池(keepalive 32),每个请求不再重新握手
  • 公开接口(作品列表、统计、团队、站点设置)加 5 秒微缓存:匿名访问直接由 nginx 回,命中率 100% 时压测 3616 rps;带登录 Cookie 的一律绕过,看到的是自己的数据
  • gzip 压缩等级与类型补齐(原本 nginx 只写了 gzip on,没写压什么),JSON 也压了
  • SQLite 页缓存从 2MB 提到 20MB、开 128MB mmap、临时表放内存
  • Node 的 keepAliveTimeout 从 15s 提到 65s,避免长连接被服务端先关掉
  • 首图加 fetchpriority=high,其余图片保持延迟加载,首屏更快看到照片
1.28.3 2026.11.2 优化

图片搬到广州,上传不再排队

图片从深圳搬到和服务器同城的广州 OSS,上传改走内网,以前一张 5MB 原图要十几秒,现在一秒内。

  • 图片存储换成 zhihui-upload-gz(华南3 广州),与这台 ECS 同城,上传走内网
  • 页面上的图片域名同步换成 zhihui-upload-gz.oss-cn-guangzhou.aliyuncs.com
  • 九十九兆历史图片一次性搬完,对象数与字节数逐项对过,一个没丢
  • 公共读、防盗链、缓存一年的响应头一并搬到新桶,浏览体验与原来一致
1.28.2 2026.11.2 优化

页脚那段话后台可改

每个页面最下面「关于这台服务器」那段,现在在后台自己写,留空就不显示。

  • 后台「站点设置 · 页脚 · 关于这台服务器」:小标题 + 正文都能改,保存即全站生效
  • 正文支持换行,按你写的分行显示;纯文本,不会被当成 HTML 执行
  • 正文留空则整段不显示 —— 不想解释服务器情况时就清掉
  • 默认文案改成现在这台机器的实际情况:2 核 2G、3M 带宽,慢了或者传失败多半是资源紧
1.28.1 2026.11.2 优化

日志时间精确到秒

后台每一行日志都带年月日时分秒,服务器日志文件也补上了时间戳。

  • 操作日志、请求日志、浏览记录、活动、举报、反馈:时间统一成 2026-11-02 15:26:09,秒级
  • 相对时间(3 分钟前)保留在第二行,两个一起看:既知道多近,也知道准确是哪一秒
  • 请求日志和操作日志导出的 CSV,时间改成本地时间秒级,Excel 打开不再差 8 小时
  • 服务器日志文件(data/site.log)每条带时间戳:2026-11-02 15:26:09 [upload] …,连刷二十遍也分得清先后
  • 投稿时间、审核时间、注册时间、邀请码使用记录同步改成秒级
1.28.0 2026.11.2 优化

热门摄影师点开就是主页

首页「热门摄影师」直接点进那个人的主页;管作品的地方多了个「管理主页」按钮。

  • 首页「这一阵按快门最多的人」卡片,点开是他自己的个人主页,不再只是搜他的名字
  • 主页关掉的人,卡片退回按作者看作品的老链接 —— 不会点进去撞一堵「未公开」
  • 账号页「我的发布」右上角新增「管理主页」按钮,一键回到自己的主页换背景、改资料
  • 主页右上角仍保留「换背景」「编辑资料」,两处互通
1.27.0 2026.11.2 新功能

主页背景与自定义标签

自己的主页可以换背景了;角色标签收起来,换成由超管亲手设的标签。

  • 个人主页右上角多了「换背景」:选一张图,压缩成长边 1600 存下来,随时可以撤掉
  • 背景图铺在整块档案头部,文字自动加暗底保证可读;手机上也按比例裁好
  • 主页不再显示「管理员 / 会员」这类角色标签,避免把身份当门面
  • 标签改由超级管理员在后台按人设:逗号分隔写几个短词,最多 6 个,主页上排成一行
  • 标签留空就什么都不显示,主页回到干净的档案版式
1.26.0 2026.11.2 新功能

评论用 AI 审核

留言也过一遍 AI:色情、血腥暴力、广告导流、人身攻击,判违规自动撤下。

  • 后台「设置 · 评论审核」三档:不审 / 先发后审(默认)/ 先审后发
  • 先发后审:留言立刻可见,AI 判违规就自动隐藏,作者收到站内通知,后台留痕
  • 先审后发:留言先进待复核,只有作者自己看得到,AI 通过才公开
  • AI 没开、超时、接口报错一律放行 —— 审核接口挂了不会让留言发不出去
  • 判违规口径只管四类:色情、血腥暴力、广告导流(含留联系方式)、人身攻击;批评作品、吐槽、闲聊一概放行
  • 后台「评论」面板新增「待复核」「AI 拦下」两个筛选,可看 AI 结论、一键通过或重跑
  • 操作日志记下每次 AI 拦下的原话与结论,可回溯
1.25.0 2026.11.2 新功能

个人主页与评论区

每个人有了自己的档案页,作品下面也能直接聊起来。

  • 个人主页 /u/用户名:头像、角色、加入时间、简介与五项统计,作品和约拍一屏看完
  • 作品与约拍详情里的作者名都能点进主页
  • 评论区:作品与约拍都能留言,支持一层回复,可随时删掉自己的
  • 防刷:同一人 20 秒一条、每小时 40 条,重复内容自动去重
  • 后台「评论」面板:按可见状态筛选、搜索内容、隐藏 / 恢复 / 删除
  • 账号设置里可一键关掉自己的公开主页(管理员仍可查看)
1.24.2 2026.11.2 修复

投稿上传:把「服务器没收下这次投稿」拆成四种真话

iPhone 上正常选好照片却被回一句「请至少上传一张作品照片」——查日志发现请求体只有 1–3 毫秒、56 字节,服务端收到的是一份 0 字节的表单。现在传输中断、照片空壳、格式不合、总量超限分别给出不同的说明和动作。

  • 服务端读取请求体时校验 content-length,收到一半就断掉返回「照片还没传完,连接就断了(收到 X / 共 Y)」,不再误报成「你没选图」
  • 一张照片存不下不再毁掉整批:其余照片照常保存,并告诉你有几张被跳过、为什么
  • 单张格式不合(如 iPhone 的 HEIC)会说明是哪一张、怎么转成 JPG,而不是整批退回
  • 服务端请求超时从 60 秒放宽到 300 秒,和 nginx、浏览器端一致,手机上行慢不再被半路掐断
  • 浏览器端 canvas 压图产出空文件时回退原图;提交前自动剔掉 0 字节的照片并提示