码桶

发现社区成员的开源项目

geekssl /

wstats

公开
main
wstats/CHANGELOG.md
CHANGELOG.md12.6 KB
# 更新日志

格式约定:`## 版本号` 开头的小节,其下的列表行即为该版本的更新条目。

## 1.0.10(未发布)

- **IP 地域解析支持 IPv6(IPv4 / IPv6 双离线库)**:`Support\IpLocator` 从「只认 IPv4」改为**按地址族分派** ——
  IPv4 走 `data/ip2region.xdb`(配置 `collect.geo_xdb`),IPv6 走 `data/ip2region_v6.xdb`(新增配置
  `collect.geo_xdb6`)。两库结构相同,但**索引项布局与字节序都不同**:IPv4 索引项 14 字节(`4+4+2+4`,
  sip/eip 为**小端**,是 ip2region 早期实现的历史包袱)、IPv6 为 38 字节(`16+16+2+4`,sip/eip 为
  **大端原样**)。因此两族的比较方式也不同(v4 比整数、v6 比 16 字节二进制串),差异全部收敛在
  `addrKey()` / `recKey()` / `keyCmp()` 三个函数里,检索流程只写一份。IPv4-mapped 地址
  (`::ffff:a.b.c.d`,双栈套接字常见)会**改判为 IPv4** 并走 v4 库(它本质就是 v4 地址,且 v4 数据更全);
  IPv6 内网/保留段(`::1`、`fc00::/7`、`fe80::/10`、组播、6to4 等)直接跳过检索,不做无效匹配

## 1.0.9

- 新增**个人中心**(`/profile`):个人资料查看与修改(昵称 / 界面语言;邮箱是登录凭证,只读展示);
  修改密码(需当前密码,成功后**其它设备立即下线**、当前设备自动换用新令牌继续有效);
  **我的操作日志**:登录 / 登出 / 改资料 / 改密,以及管理员对本账号的全部操作(创建、改密、禁用、删除等)
  逐条留痕(时间 / 动作 / 说明 / IP),分页展示
- 新增**用户管理**(`/users`,仅系统管理员):全部注册用户的增删改查 —— 关键词与状态筛选、分页列表
  (含站点数、最近登录时间);新建用户(可设为管理员);编辑昵称 / 语言、重置密码
  (重置后该用户全部会话立即失效);**禁用 / 启用**(禁用立即踢下线且无法登录);
  删除用户(级联清理其令牌 / 站点成员关系 / 告警配置等个人数据,`alert_logs` 留痕保留);
  一键查看某用户**名下与被授权的全部站点**。防锁死保护:不能禁用 / 删除 / 降级自己,
  不能动最后一个管理员;名下有站点的用户拒绝删除
- 新增操作日志基建 `user_op_logs`(增量 SQL `sql/upgrade-2026-09-16-profile-users.sql`,
  幂等可重复执行;老库未执行时功能自动降级并给出明确提示,不影响其它功能);

## 1.0.8

- **访客真实 IP 改为「手动指定取值来源」,程序不再做任何自动判断**:此前会自动识别 Cloudflare 回源段、
  按可信代理列表与头优先级顺序推断,分支多、结果难以预期。现在管理员在系统设置 →「真实 IP 采集」中
  从 **X-Forwarded-For / X-Real-IP / REMOTE_ADDR / 自定义头** 四项里**显式选一个**,程序只做一件事:
  取该来源头里**最右侧**的合法 IP(Cloudflare 与 Nginx 都把真实地址**追加**到末尾,客户端伪造值只能残留在
  左侧 —— 取最左等于采信攻击者输入);指定头缺失或值非法时回落 `REMOTE_ADDR` 并标注
- **真实 IP 自检升级**:新增「候选来源实测表」,一次性列出四个来源在**当前连接**下的真实取值 ——
  哪一行显示出你的真实地址就选哪一行,并支持一键套用;同时回显取值来源与头名、是否发生回落、
  `REMOTE_ADDR` 是否属于 CDN 回源段、地域解析结果与处置建议
- **站点验证弹窗新增「下载验证文件」按钮**:下载验证文件放到站点根目录即可完成验证,
  不必再手动复制令牌(下载失败时仍回显可访问 URL 作为兜底)

## 1.0.7

- 修复**「概览 IP 数」与「IP 地域页」数字对不上**(如概览显示 4、地域页只有 3):
  概览的 UV / 独立 IP 此前在 Redis 可用时走 HyperLogLog 估算(`PFCOUNT`),而估算结构在极小基数下会多估,
  且与地域页的精确值天然是两个口径。现在**UV / 独立 IP 一律由 `events` 明细精确去重**
  (跨天合并也在 SQL 内完成),概览、环比、IP 地域页、大屏、开放接口全部同源同口径,
  **Redis 与无 Redis 两种部署形态结果完全一致**;估算路径(含采集端 `PFADD`)已整体移除
- 修复**大屏 / 开放接口区间 UV、独立 IP 重复计数**:此前把每日汇总值逐日相加(跨天不去重),
  区间越长越偏大;现改为区间精确去重
- 修复**每日独立 IP 把空 IP 计为 1 个**:取不到真实 IP 的事件不再计入独立 IP(与 IP 地域页 `ip<>''` 口径一致)
- IP 地域页的「IP 统计」改为按 `events` 聚合(PV / UV / 会话数),并显示区间独立 IP 总数,
  与概览「IP 数」严格一致

## 1.0.6

- 新增**外部代码注入**:系统设置里可粘贴第三方统计(百度统计、Google Analytics 等)或在线客服代码,
  保存后按原样注入本站每个页面 `</head>` 之前,用于统计本站自身访问、挂载客服窗口(仅管理员可配置;
  与「站点接入代码模板」相互独立——后者是给被统计站点站长粘贴的模板,本站不渲染)
- 新增**每个页面独立标题**:浏览器标签页标题按路由显示「页面名 · 应用名」(跟随中英文切换),
  移动看板 `/m` 的标题跟随当前 Tab
  对确属 CF 回源的请求优先读取 `CF-Connecting-IP`;同时修好代理匹配的 IPv6 支持
  (旧实现用 `ip2long`,对 IPv6 恒 false → IPv6 回源时判定会静默失效)
- 新增**真实 IP 自检**:系统设置 →「真实 IP 采集(CDN / 反向代理)」一键检测,回显 REMOTE_ADDR、
  最终判定的访客 IP、取值来源、每个代理头的原始值与是否采用、地域解析结果与处置建议
  (新接口 `GET /api/settings/ip-check`,仅系统管理员)

## 1.0.5

- 新增**站点接入代码自定义**:系统设置里可填写本系统的接入代码模板(支持 `{site_key}` / `{host}` / `{origin}`
  占位符,留空即用内置默认片段),Sites 页「查看 SDK 接入代码」与复制按钮直接使用该模板,
  站点成员无需管理员权限即可查看(新接口 `GET /api/sdk-code`)
- 修复**安装向导创建的第一个账号没有管理员权限**:`users.is_admin` 列默认值为 0,
  而「首个账号即管理员」的回退逻辑只在 `is_admin` 列缺失时才生效,列存在却没写 1 就只是普通用户,
  导致装完进不了「系统设置」;现在安装向导与注册接口(库中还没有用户时)都会显式写入管理员标记
- 安装向导**只展示必须项**:环境检测默认只展开必须项并显示「必须项 N/M」与未通过项,
  其余可选/提示项收进「查看其余检测项」折叠区
- 修复安装向导**数据库与 Redis 表单错位**:输入框改为固定两列布局并占满列宽(此前列数随内容跳变、
  控件宽度随默认字符数伸缩),复选框移出网格单独成行,窄屏自动转为单列
- 发版脚本新增**已发布版本守卫**:`versions.json` 中已存在同版本号的包时,构建会在改动任何文件之前中止,
  避免开发副本忘记升版本号直接打包、悄悄替换掉已发布包导致老客户端校验失败(确需重打用 `--republish`)

## 1.0.4

- 新增**移动端看板**(独立入口 `/m`):概览 / 实时 / 来源 / 页面 四个主界面,
  底部 Tab 切换、区间可切换、与桌面端共享站点选择与登录态;手机与平板打开站点时**登录后自动进入移动看板**,
  桌面端仍进概览;桌面侧栏不再放移动看板入口(移动看板自身顶部保留「桌面版」入口)
- 前端**代码分割与按需加载**:26 个页面由静态 import 改为路由级懒加载(React.lazy + Suspense),
  ECharts 由整包引入改为按需注册(line/bar/pie/map/funnel/sankey + 必要组件 + Canvas 渲染器);
  首屏 JS 2625KB → 525KB(gzip 172KB),ECharts 653KB 独立成 chunk,只在进入带图页面时下载
- 界面语言**按浏览器语言自动适配**:首次访问按 `navigator.languages` 判定(中文 → 简体中文,其余语言 → 英文),
  登录 / 注册 / 忘记密码等未登录页面同样生效;手动切换过的语言记入 `localStorage` 并优先于浏览器语言
- 移除「功能全景」页面及其侧栏入口(页面为静态清单,不涉及后端接口);
  相关说明与指标口径请见「指标口径说明」页与 `CHANGELOG.md`
- 移动端判定兼容 iPadOS 13+(该版本 Safari 默认上报 Macintosh UA,以 `maxTouchPoints` 补判)

## 1.0.3

- 修复页脚版本号长期停在旧版(升级到 1.0.2 后仍显示 `v1.0.0`):以前版本号有两个来源,
  其中一个 `data/installed.php` 的 `version` 是「安装当刻的快照」,在手工覆盖代码 / 目录迁移这两种
  最常见的升级方式下**永不刷新**,于是生效版本永远停在安装那一版
- 修复「检查更新一直提示存在更新」:上一条的旧版本号被原样报给更新服务,远端返回
  `latest=1.0.2 > 本地 1.0.0`,于是 `has_update` 永远为真;点「一键升级」又被布局守卫拒绝,形成死循环
- 版本号与页脚品牌改为**单一事实来源的密封载荷**(`app/version.php`):异或密钥流 + HMAC-SHA256,
  源码与配置里不再出现明文版本号/品牌名;手改密文即校验失败并回落官方默认(版本显示 `0.0.0`),
  而不是「改一个字就生效」;改版本号只有一条正当路径 —— 改 `install/lib.php` 的 `VERSION` 后执行
  `php scripts/seal-version.php`(注意:这是混淆而非防破解,密钥就在源码里)
- 版本号随代码走:密封载荷放在 `app/` 下,属更新白名单且不受 `preserve` 保护,
  一键升级或手工覆盖代码都会一并更新,**以后升级不再需要手工改任何版本号**
- `data/installed.php` 的 `version` 降级为纯记录字段(安装快照 + 部署凭据),合并配置时被显式忽略;
  一键升级不再回写它,升级流水改记到 `data/version.json`(含最近 20 条历史)
- 发版脚本新增两道硬校验:密封载荷与 `Installer::VERSION` 不一致、或包内解出的版本与构建版本不一致,
  直接中止构建,杜绝「发出去的包页脚版本对不上」
- 修复 `doctor.php` 队列类型诊断行输出为空:全角逗号紧跟 `$qt` 被 PHP 当成变量名的一部分,实际输出
  成了「实际==list」

## 1.0.2

- 修复国旗图标在部分国家下导致整页报错:马来西亚 / 澳大利亚 / 土耳其的星形坐标被写成字符串,
  `cx + r * Math.cos()` 变成字符串拼接,渲染时抛 `toFixed is not a function`,
  且因图标是条件渲染,仅当访客来自这些国家时才复现;现已在组件内强制转数字并修正写法
- 构建前静态门禁新增一类检查:几何数值属性被写成字符串(`cx="8.4"` 应为 `cx={8.4}`),
  这类问题 `vite build` 不报错、只在运行期炸;另新增图标真渲染冒烟脚本,覆盖全部国旗与环境图标分支

## 1.0.1

- 发布包目录结构统一为 `app/` `data/` `public/` `scripts/`,`public` 即网站运行目录,不再区分普通版与宝塔版
- 新增在线更新:`https://wstats-update.kfw.cc/update.php` 提供版本索引与增量更新包,面板「关于与更新」支持检查更新与一键升级
- 升级前自动备份被覆盖文件到 `data/backup/`,执行新增的 `sql/upgrade-*.sql` 增量脚本
- 安装向导按新目录结构重新探测项目根与建表脚本位置
- 发布包内附 `data/ip2region.xdb` 离线 IP 库,地域统计开箱可用
- 发布包瘦身:去掉开发/造数脚本(`selftest-*`、`seed-*`)、历史参考 SQL(`schema.sql`、`wstat.sql`)、
  开发文档(架构说明、内部功能审计报告)、已废弃的宝塔扁平包配置样例、重复的 `sdk/` 副本与陈旧前端产物;
  构建时双向校验「开发产物不得入包 + 运行期必需文件必须在包」,包体 18.6MB → 16.0MB

## 1.0.0

- 首个正式版本:PV/UV/IP/会话/停留时长/跳出率、来源、地域、终端环境、页面下钻
- 实时概览、数据大屏(时间筛选 / 刷新倒计时 / 全屏)
- 漏斗与转化目标、广告追踪、热力图、访客旅程、受众分析
- 开放 API(PAT 令牌)、CSV 导出、流量异常告警与日报推送
- 多用户协作(所有者 / 编辑者 / 只读)、系统设置、注册邮箱验证码与忘记密码
- 宝塔/通用 Nginx、Apache 部署样例,Web 安装向导与 CLI 安装