9 Commits
Author SHA1 Message Date
JunoZ-DEVandClaude Opus 5.5 8ab01946ca feat(admin): 访客来源统计(不论是否注册)
- 首页与登录页到站时用浏览器匿名访客编号上报一次来源(POST /api/public/visits,sendBeacon,失败回退 keepalive fetch)
- 同一访客同一天(北京时间)同一来源只记一次:前端当日去重 + visitor_visits 唯一约束(迁移 092)
- 站内跳转不上报,无信号的外部到站记为直接访问;邀约链接无推广参数时归为邀约
- 接口在全局限流外单独限制每 IP 每分钟 10 次,爬虫与脚本 UA 不入库,不保存 IP 与 UA
- 明细默认保留 180 天(VISITOR_VISITS_RETENTION_DAYS),worker 每天分批清理
- 注册归因带上匿名访客编号,写入 user_acquisitions.visitor_id
- 仪表盘「注册来源分布」改为「流量来源」:今日 / 近 7 天 / 本月的访客、新访客、注册、转化、付费与收入
- 隐私政策、README、AGENTS、CHANGELOG 同步

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 06:58:45 +08:00
JunoZ-DEVandClaude Fable 5.1 8ed5a727e9 feat(admin): 注册来源归因首版(流量来源)
- 推广链接 utm_* / from 在首页或登录页采集,localStorage 保存 30 天,first-touch 优先
- 注册时随 attribution 提交,服务端按白名单归类写入 user_acquisitions(迁移 091)
- 无参数按来源站点域名归类,直接访问记 direct,仅邀约链接记 referral
- 后台用户列表新增来源列与筛选,用户详情显示来源明细,仪表盘新增注册来源分布
- 首页跳转 /login 时保留查询参数,修复从首页进入丢失邀约码 ?ref=
- 隐私政策补充来源统计说明;README / AGENTS / CHANGELOG 同步

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-16 06:37:24 +08:00
JunoZ-DEVandClaude Fable 5.1 7e02b8a2be test: 修复 mcpSecurity 篡改密文用例偶发不抛错
随机 nonce 的 base64url 首字符恰为 X 时,原用例写 'X' + slice(1) 等于没有篡改,
导致 unseal 正常解密而断言失败(CI main 475f08e 偶发)。改为翻转首字节。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-16 06:22:53 +08:00
JunoZ-DEVandClaude Fable 5.1 5c95b5219f feat(security): API 增加全局限流,修正站点地图脚本的 XML 实体解码顺序
- 注册 @fastify/rate-limit,默认每个来源 IP 每分钟 600 次,RATE_LIMIT_MAX 可调、0 关闭
- submit-baidu-urls 的 decodeXmlEntities 最后替换 &amp;,避免二次解码
- 对应 CodeQL js/missing-rate-limiting 与 js/double-escaping 告警

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-16 05:19:20 +08:00
JunoZ-DEVandClaude Fable 5.1 c9766d5495 feat(security): 处理审查中的中低风险项,CI 支持按用例手动触发
- /oauth/reg 动态注册按来源 IP 限流;未产生授权的 Client 记录 24 小时后由
  现有维护任务清理
- 限流键哈希、本地存储 URL 签名、分页游标签名改用 HKDF 从 JWT_SECRET 派生的
  用途隔离密钥
- 新增 POST /api/auth/logout-all 与账户中心"退出所有设备"
- 密码上限 32 位放宽到 128 位;生产构建缺少 publicCompliance.local.json 时警告
- SECURITY.md 补充裸机 HOST 绑定与支付回调来源白名单说明
- CI 增加 workflow_dispatch 参数:只跑指定 e2e 用例、可包含被隔离用例以拿 trace

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-16 04:47:16 +08:00
JunoZ-DEVandClaude Fable 5.1 b842c11ec3 chore(deps): 升级 recharts 3、@fastify/cors 11、nanoid 6 与 17 项小版本
合并 Dependabot 的 #1-#4、#6-#8:GitHub Actions 升到 v7,TypeScript 7 暂不升级并
在 Dependabot 中忽略其主版本。recharts 3 适配:图表回调的 activeLabel 放宽为
string | number;e2e 改用 v3 的标签图层定位 X 轴日期。Tailwind 4.3 的 sr-only
改用 clip-path,对应断言改为只检查视觉隐藏。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-16 04:37:06 +08:00
Juno ChowandClaude Fable 5.1 fc8cca1f6c fix: 补提交被 .gitignore 误忽略的 apps/api/src/storage 目录
storage/ 规则本意是忽略本地上传目录,却把同名源码目录一起排除了,
本地有文件所以未察觉,CI 的 API 类型检查暴露出来。规则改为只匹配
根目录与 apps/api 下的 storage,其余宽泛规则一并锚定到根目录。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-16 02:58:08 +08:00
Juno ChowandClaude Fable 5.1 9e54555009 fix(security): 修复开源前审查的三项高风险
- 升级含已知漏洞的间接依赖(fast-jwt、tar、nanoid、postcss 等),npm audit 清零,
  CI 增加 npm audit --audit-level=high 门禁
- TRUST_PROXY 支持跳数与 IP/CIDR 列表,不再只能信任全部上游;docker-compose 的
  API 端口默认只绑定 127.0.0.1
- API 镜像以非 root 用户 node 运行,存储目录预先授权
- Node 版本声明改为 >=22,与生产镜像一致

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-16 02:33:29 +08:00
Juno ChowandClaude Fable 5.1 f665082dad chore: 建立产品仓库,完成开源前的敏感信息清理
前端(Vite + React)、API/worker(Fastify + BullMQ)、api-contracts 契约包、
迁移脚本、测试与自托管 docker-compose 示例。

开源准备:运维脚本与机器信息已拆到私有仓库;公司名、备案号、隐私邮箱改读
publicCompliance.local.json(仓库只保留占位模板);站点地址与客服二维码改为
VITE_ 环境变量;fixtures 中的真实用户标识已匿名化;三个 package.json 标注
Apache-2.0。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-16 02:10:46 +08:00