更新日志
ShipAny 模板更新动态
v1.0.6
用户操作记录、自定义事件上报与管理员修改密码
adminanalyticsagent
- 用户操作记录 —— 用户详情页新增时间线,把一个用户从注册、下单、付款、开通订阅、积分入账和消耗、AI 生成成功或失败,到提交工单的全过程按时间排在一起。数据来自现有的表,升级后历史记录马上可见
- 时间线可读、可点 —— 默认最早在前,从上往下就是用户的转化路径,也可以切到最新在前看最近动态;每一行都能点开对应的订单、订阅、积分流水或工单;同一时刻的事件按实际流程排列(创建订单 → 付款 → 开通订阅 → 积分入账)
- 自定义事件上报 —— 在
src/config/events.ts登记事件后,服务端用recordEvent()、前端用track()上报,事件会出现在时间线里。模板自带「选套餐」(定价表点击时自动上报)、「碰到付费点」「风控记录」三个示例 - 接入自己的业务表 —— 已经记在项目自己表里的事件(比如赠送记录),在
timeline-sources.ts里加一个读取函数就能出现在时间线上,还能指定点击后打开的后台页面 - 超级管理员修改用户密码 —— 用户列表菜单新增「修改密码」,修改后该用户在所有设备上退出登录;只用 Google/GitHub 登录过的用户也会获得邮箱密码登录方式。需要单独的
admin.passwords.reset权限,不能修改权限比自己高的账号,Agent Key 不可调用 - Agent 可查用户经历 —— 新增
users_timeline接口,Agent 可以直接回答「这个用户是怎么转化的、卡在哪一步」 - 用户列表菜单加宽,菜单项不再换行;订阅、积分列表支持通过链接带入搜索词
- 上报流程写进了规范和 Skills:
AGENTS.md新增「Product events」一节;new-module、new-page、quick-start会提示 Agent 在付费点、关键操作处上报事件,shipany-admin说明了如何用时间线调查用户 - 上报默认安全:只有标记为前端可上报的事件才能从浏览器发送,付款、风控、权限类事件只能由服务端记录;前端上报仅限已登录用户和本站页面,有频率限制,
detail只能是有限的扁平字段 - 新增事件上报、时间线排序和分页、修改密码的测试
- 数据库结构:新增
user_event表,不改动现有表。schema.ts不在 git 里,需要手动同步后执行迁移 - 新权限:执行
pnpm admin:token sync-permissions登记admin.passwords.reset - 完整步骤见仓库根目录
UPGRADING.md的 2026-10-12 条目
v1.0.5
Agent API、数据看板、支付退款与 D1 原子写入,全面安全加固
agentadminpaymentsecuritycloudflare
- Agent API —— 在后台「Agent 接入」页面创建 Agent 账号,按角色授权,签发可设置有效期、只显示一次的
sa_admin_Key。Claude Code、Codex 等 Agent 可以通过 Skill 或 MCP 操作管理后台;所有调用都有幂等日志,可在「操作日志」里按 Agent 查看 - 多站点 Skill 客户端 —— 一个 Agent 可以同时管理多个 ShipAny 站点,各站点的 Key 分开保存在本地(权限 0600),按项目名切换
- 数据看板 —— 后台概览新增核心指标(用户数、近 30 天净收入、活跃订阅、待处理工单)和按注册批次统计的转化漏斗,可按 UTM、来源、国家筛选。新增
analytics_report接口,Agent 可以直接生成日报、周报 - 后台退款 —— 订单可以一键退款,支持 Stripe、Creem、PayPal、支付宝、微信支付;退款时扣回对应积分,可选同时取消订阅。退款需要单独的
admin.payments.refund权限,默认只有超级管理员拥有 - 用户详情页 —— 查看注册来源(UTM、来源页、国家)、角色、订单和积分汇总;用户列表新增 ID、生效角色列和 utm_source 筛选
- 后台列表体验 —— 支付、订阅、积分、工单列表用头像 + 名称 + 邮箱展示用户,点击打开详情;各列表搜索不区分大小写,可按邮箱、名称或用户 ID 搜索
- 机器人通知 —— 新订单和工单动态推送到 Telegram、飞书、企业微信或通用 Webhook
- Cookie 同意弹窗 —— 在后台开启,页脚提供「Cookie 设置」入口
- 人民币定价 —— 商品可以单独设置
cnyPriceInCents,支付宝和微信按人民币价格收款
- 支付回调校验:支付宝、微信的通知除了验签,还要核对
app_id/ 商户号和订单金额,其他商户的交易无法冒充本站付款 - 积分只发一次:订单结算加了检查条件,积分流水号由订单号生成并受唯一约束保护;后台编辑订单只能把未付款订单关闭,不能把已付款订单改回待支付
- 防止提权:分配角色和权限时,不能超出操作者自己拥有的权限;拥有管理权限的角色不能设为新用户默认角色
- 账号接管防护:升级 better-auth 1.7,邮箱未验证的密码账号不会再被 OAuth 登录自动关联
- 密钥外泄防护:修改 OpenAI、Anthropic、R2、Telegram、通知 Webhook 的请求地址时,必须重新填写对应密钥
- 脚本注入防护:统计、广告、客服插件的 ID 在保存和渲染时都会校验格式;Plausible 脚本只允许同站代理路径、plausible.io,或部署配置
VITE_PLAUSIBLE_SCRIPT_HOSTS中的域名 - 限流和上传:限流按 IP 和用户计算,不能再靠更换 Cookie 绕过;单次上传最多 10 个文件、总计 20MB,不接受 SVG
- Workers 上优先使用不可伪造的
cf-connecting-ip识别客户端 IP;seroval升级到 1.6.8
- D1 原子写入:D1 不支持交互式事务,原来的
db().transaction()在 D1 上是逐条执行的,中途失败会出现「付了款没到账」或「积分扣了一半」。新增atomic(),在 D1、SQLite、Turso 上用batch()一次提交,在 Postgres、MySQL 上用真事务。支付入账、续费、退款、积分扣减和退回、AI 任务创建、邀请码兑换都已改用它,并在本地 D1、SQLite、Postgres 上做了并发测试 - 美元价格不再被当作人民币收取:没有设置人民币价格的商品,支付宝和微信会拒绝下单
- Workers 数据库连接:Postgres、MySQL 改为每个请求单独建立连接;Hyperdrive 默认关闭查询缓存,避免读到最多 60 秒前的旧数据(订单状态、余额、后台设置)
- 部署:
compatibility_date固定到具体日期,避免本地时区比 UTC 早时部署失败 - 支付成功后默认跳转到
/settings/payments;订阅列表的搜索此前不生效,现在可以正常筛选
- AGENTS.md 新增两节规范:「Atomic writes」介绍
atomic()的用法;「Security & Integrity Rules」把这次修复的问题总结成写新功能时要遵守的规则(金额、回调、权限、密钥、限流、测试) - 新增
UPGRADING.md:已有项目拉取模板更新时,Agent 按它一步步完成升级(同步 schema、迁移数据库、补登记权限、需要手动处理的事项) - 新增测试命令
pnpm test:atomic、test:atomic:d1、test:atomic:pg,以及支付、退款、权限相关的回归测试 pnpm admin:token命令行可以创建 Agent 和签发 Key,也能补登记新增的权限
- 数据库结构:只新增字段和表,不删除任何内容。
schema.ts不在 git 里,需要手动同步新字段后执行迁移 - 支付宝、微信:要给商品配置
cnyPriceInCents,否则这两个渠道无法下单 - 自托管 Plausible:脚本地址是自己域名的完整 URL 时,要把域名加到
VITE_PLAUSIBLE_SCRIPT_HOSTS并重新构建(构建时写入,只在运行时设置无效),否则统计脚本不会加载;/js/script.js这类同站代理路径不受影响 - 新权限:执行
pnpm admin:token sync-permissions补登记 - 完整步骤见仓库根目录的
UPGRADING.md
v1.0.4
Webhook 可靠性、后台工作流、桌面端登录交接
paymentauthadmindx
- 后台工作流升级 —— 支付订单详情/编辑弹窗、用户与角色权限页面重做、API Key 管理增强、工单处理优化
- 在线客服组件 —— Crisp 和 Tawk.to,在后台设置中开关
- Cloudflare Email 邮件服务商 —— 与 Resend 并存,认证邮件改走统一的服务商接口
- 登录后回到原页面 —— 登录页、Google One Tap、客服组件和支付结账都会带上来源页面,完成后原路返回
- 桌面端登录交接 —— 新增
/auth-callback页面,把会话 token 交给myapp://…这类应用协议地址,仅限新设置项desktop_auth_schemes白名单内的协议(默认为空即关闭) - 注册赠送生效 —— "注册赠送积分"开关和默认角色现在会真正发放给新用户
- /ads.txt 路由与 AdSense 支持
- AUTH_TRUSTED_ORIGINS 支持域名后缀通配(
.e2b.app),适配沙箱预览域名
- Cloudflare Workers 上的 Stripe Webhook:验签改为
constructEventAsync()—— 同步调用会抛出 "SubtleCryptoProvider cannot be used in a synchronous context",导致所有事件处理失败 - Webhook 失败返回 500,让支付服务商重试。此前返回 HTTP 200,Stripe 会判定投递成功,续费、周期积分和订阅状态同步被静默丢弃。本身不处理的事件仍返回 2xx 确认
- 订阅续费:续费发票正确路由到续费处理逻辑(此前走首购分支),并按服务商 + 发票 ID 幂等去重
- 后台设置:保存后立即生效(配置缓存刷新);公开配置接口不再返回密钥
- 下拉选择器:收起状态显示选项文案,不再显示原始值
- Docker 构建:读取
.env.production并在 builder 阶段设置NODE_ENV,确保VITE_*变量被正确注入 - 开发服务器:放行 e2b 沙箱预览域名
- design-theme 技能 v2 —— 根据项目简介生成独特的视觉风格,内置 9 种风格方向库和"反套路"检查清单,新站点不再是千篇一律的模板样子
- 沙箱预览桥接 —— 向 ShipAny Code 父窗口上报路由变化和页面内链接
- AGENTS.md:管理后台交接说明、schema 变更后必须执行
pnpm db:push、沙箱内可用 Playwright/Chromium
v1.0.3
llms.txt、错误页面、Creem 映射、邮箱验证修复、Prettier
seouxpaymentauthdx
- /llms.txt 和 /llms-full.txt 路由 —— 面向 AI 的站点地图,根据页面和博客文章自动生成
- 根路由新增样式化 错误边界 —— "出错了"标题、重试按钮、开发模式错误详情(替换 TanStack Router 默认样式)
- Creem 产品 ID 映射 —— 后台配置内部产品 ID 到 Creem
prod_xxx的映射,结账时自动转换
- 邮箱验证:公开配置接口支持 Cloudflare Email 判断
email_verification_enabled和password_reset_enabled - 登录:直接检测
EMAIL_NOT_VERIFIED错误码,始终跳转到验证页面 - 验证页面「继续」:未验证时显示 toast 提示,不再跳转到登录页
- Prettier + husky + lint-staged —— 提交时自动格式化
- 新增脚本:
pnpm format和pnpm format:check - 已执行全量代码格式化
v1.0.2
OpenAI 与 Anthropic 配置、自定义配置、登录回跳
adminaiauth
- 后台 AI 设置新增 OpenAI 与 Anthropic 两类配置(自定义
Base URL+ API Key),各自带一键 测试(发起真实的对话补全连通性校验);移除 Gemini 配置 - 配置 测试 现在使用表单中当前填写的值(即使尚未保存),并回退到已保存配置(打码的密钥保持不变)
- 新增 自定义 配置 tab —— 以 key/value 形式管理任意配置,支持增删行
- 认证:受保护页面未登录时携带
callbackUrl跳转登录,登录后自动回到原页面;在登录 / 注册切换时也会保留
- Turso:修复
drizzle.config.ts(turso dialect 映射 +DATABASE_AUTH_TOKEN),使db:push/db:generate能正确认证远程 libsql 数据库
v1.0.1
支持一键部署到 Cloudflare Workers
cloudflaredeploy
- 支持一键部署到 Cloudflare Workers(D1 或 Postgres + Hyperdrive)
- 新增
deploy-cloudflare技能,自动处理 D1、密钥、schema 推送与重新部署 - 修复若干 SSR 与 hydration 边界问题
v1.0.0
ShipAny TanStack 首个版本发布
releasetanstack-start
ShipAny 家族最新成员,把整套 agent-native 业务引擎搬到了 TanStack Start 上。
- 基于 TanStack Start(Vite 8 + Nitro + React 19、TypeScript strict)的全新模板
- 文件路由,无 RSC、无
"use client",所有组件都是普通 React - TanStack Query / Form / Table 全家桶,搭配类型化的 api-client
- Paraglide JS 国际化,编译期生成、可 tree-shaking 的消息函数
- better-auth + Drizzle ORM,共享 ShipAny 模块化业务逻辑(认证、积分、支付订阅、API key、RBAC)
