Skip to content

Changelog

本项目遵循 Keep a Changelog 格式,版本号遵循 语义化版本

本仓库是 ydadmin 的 SaaS 分支。前半部分是 SaaS fork 的版本历史(v0.1.0 起),后半部分是 upstream ydadmin 的版本历史(v1.5.1 起),两者通过 scripts/sync-upstream.sh 定期同步。

[Unreleased]


SaaS Fork 版本历史

以下为 元点-Saas(本仓库)的版本,按 SemVer 独立编号。每个大版本对应一个 milestone,里程碑计划归档在 docs/superpowers/plans/

[0.4.0] - 2026-04-08

Added — M4 部署基础设施 + 文档

  • Nginx 多 vhost 配置docker/nginx/default.conf):
    • admin.$SAAS_ROOT_DOMAIN → 平台超管后台(platform/dist + /platformapi + /api/saas/notify 支付回调)
    • *.$SAAS_ROOT_DOMAIN(正则通配,捕获 $tenant_code)→ 租户后台(tenant/dist + /tenantapi + /api
    • $SAAS_ROOT_DOMAIN / www.$SAAS_ROOT_DOMAIN → 公共前台(pc/.output/public + /api
    • default_server 返回 444 防 IP 直连暴露
    • docker/nginx/includes/saas_common.conf 共用片段(安全头 / gzip / /storage / /uploads
  • docker/nginx/entrypoint.sh:纯 POSIX sed 把 SAAS_ROOT_PLACEHOLDER 替换成 $SAAS_ROOT_DOMAIN 环境变量(避免 alpine 默认不带 envsubst)
  • docker/docker-compose.yml 更新:nginx service 新增 platform/dist / tenant/dist / pc/.output/public 三个 bind mount;entrypoint 改为 /docker-entrypoint-saas.shSAAS_ROOT_DOMAIN.env.docker 注入
  • docker/.env.docker 追加 SAAS_ROOT_DOMAIN 配置项
  • DEPLOYMENT.md — 13 步生产部署指南(DNS 配置 → .env 填写 → 前端构建 → Docker compose → 迁移 + 种子 → 创建平台超管 + 首个租户 → HTTPS Certbot → cron 设置 → 常见问题排查 → Roadmap)
  • README.md SaaS positioning:标题改为 元点-Saas,顶部声明 soft fork,新增 "SaaS 特性" 章节列出 11 条 SaaS 专属能力
  • ARCHITECTURE.md 新增 "SaaS 多租户架构" 章节(约 150 行):物理三域名隔离 / 后端三 API app / TenantContext 自动 scope / 双 JWT secret / lifecycle 状态机 / 计费数据模型 / 配额 + 功能开关 / 支付抽象层 / 红线测试清单 / 前端 SaaS 组件

Deferred — 下个 milestone

  • pc/ 和 uniapp/ 的前端 SaaS 多租户改造(目前通过后端 JWT + TenantContext 中间件被动 scope 工作正常)
  • pc/ 和 uniapp/ 的 v-feature 前端守卫
  • SSL/Certbot 自动化
  • 水平扩展多 PHP 容器 / Kubernetes 配置
  • E2E 多域名集成测试
  • 平台可视化监控(Grafana 面板)

[0.3.0] - 2026-04-08

Added — M3 SaaS 计费闭环

M3A — 订阅 / 订单数据层 + 生命周期 cron

  • 三张表subscriptions(订阅记录,append-only)/ saas_orders(SaaS 订单)/ tenant_usage_daily(每日用量快照)
  • SubscriptionServicecreateInitial / extend / getCurrent / listOfTenant,DB 事务保证 subscriptions + tenants.expires_at 一致
  • SaasOrderServicecreateOrder / markPaid / markCancelled / markRefunded 状态机
  • TenantService.create 重构:改为 tenant 创建 + SubscriptionService.createInitial 两步一事务
  • CLI saas:tenant-lifecycle — 每小时扫描 expires_at,自动处理 grace / frozen 状态转移 + 写 tenant_usage_daily 快照
  • SaasOrderFlowTest 2 个集成测试

M3B — 支付网关 + 回调 + 续费端点

  • core/saas/payment/SaasPaymentGateway — 平行于 core/payment/PaymentManager 的 SaaS 级支付网关,复用 WechatPayDriver / AlipayDriver,但配置源从 config/saas.php(平台级)而非 system_configs(租户级)
  • core/saas/payment/driver/MockDriver — 测试用 Mock driver,通过 setDriver 注入
  • SaasOrderService::createPayment — 调用网关 driver->create(),回写 prepay_id
  • SaasOrderService::handleCallback — 验签 + 幂等(已支付直接返回 true)+ 金额校验(整数分比较,防 double 精度陷阱)+ markPaid TOCTOU 防护 + 非 paid 终态 ACK + 空 trade_no 拒绝
  • tenantapi/subscription endpointscurrent / create-order / pay / query-order,服务层 expectedTenantId 硬校验 + 跨租户 / 不存在统一 404 响应 + 输入白名单校验 + queryOrderprojectOrder 投影隐藏 prepay_id / transaction_id 等内部字段
  • /api/saas/notify/{wechat,alipay} 匿名回调路由SaasPaymentGateway::channel() 先取 driver fail-fast,然后 handleCallback;异常 catch 后日志记录 + 非 200 响应让平台重试
  • platformapi/orders endpointsindex / show / mark-paid / cancel / refundrefund 只推进状态机不调用 gateway
  • CLI saas:order-cleanup — 原子条件 UPDATE 批量取消 status=1 AND expired_at < NOW() - 60s 的订单,避免和回调竞态
  • SaasPaymentFlowTest 3 个集成测试(完整流程 / 金额篡改 / 过期订单)

M3C — 配额 + 功能开关 + 红线 7/8

  • TenantQuotaServiceusage / assertCanStore / consume / release,原子 inc/dec 用 Db::table('tenants')->inc(),release 用 GREATEST(0, CAST(... AS SIGNED) - ?) 防下溢
  • TenantFeatureServicehasFeature / hasAnyFeature / requireFeature / listFeatures,per-request 缓存按 tenant_id 隔离,读取路径兼容 middleware nested raw 和测试扁平两种 shape
  • UploadController.handleUpload 首行调 assertCanStore
  • FileService.recordFile 成功后 consumedeleteFile DB 删除确认后 release(物理删除失败不影响配额,悲观策略)
  • CodeGeneratorController 4 个端点共用 assertFeature() 私有 helper 调 requireFeature('code.generator')
  • init.sql plans.features 填充:free [] / basic ["wechat.official", "sms.send"] / pro 全部 5 个 feature
  • 红线测试 Test7(存储配额硬拦截)5 个 case + Test8(功能开关后端守卫)5 个 case

M3D — 前端续费 UI + 订单管理 UI

  • tenantapi/subscription/plans 公共套餐列表端点 + PlatformAuthService.info 追加第 5 项菜单 "订单管理"
  • qrcode npm 包 + tenant 类型扩展(PlanInfo / SubscriptionInfo / SaasOrderInfo / PaymentData / PaymentResponse
  • tenant/src/api/subscription.ts — 5 个方法封装 M3B 后端端点
  • tenant/src/views/subscription/index.vue — 重写 M2D shell:套餐 radio + 月数 radio-group + 渠道 radio + 金额预览 + 立即支付按钮
  • tenant/src/views/subscription/components/PayDialog.vueqrcode.toCanvas 渲染 WeChat native 二维码 + Alipay HTML body 用 Blob + URL.createObjectURL 沙箱加载 + setInterval 3 秒轮询 queryOrder(status=2 emit success / status=3/4 提示关闭 / 网络错误不中断)+ close/unmount 时清理 timer + blob URL
  • platform/src/api/order.ts — 5 个方法(list / show / markPaid / cancel / refund)
  • platform/src/views/order/index.vue — 搜索卡片(order_no / status / tenant_id)+ 表格 + 分页,沿用 useListPage hook
  • platform/src/views/order/components/OrderDetail.vueel-descriptions 全字段展示 + 根据 status 动态显示操作按钮(待支付: 强制标记已支付 / 取消;已支付: 退款;终态: 无)

Tests

  • phpunit 208 tests(195 M3A baseline + 3 M3B + 10 M3C)
  • 红线 31 tests 跨 Test1-8

[0.2.0] - 2026-04-08

Added — M2 平台前台 + 租户生命周期 UI

M2A — platformapi 骨架 + 平台超管登录

  • 9 张 platform_*:platform_admins / platform_admin_tokens / platform_roles / platform_permissions / platform_role_permissions / 等
  • PlatformAuthService / PlatformContextMiddleware / PlatformAuthMiddleware
  • /platformapi/auth/{login,info,logout,refresh} 端点
  • 双 JWT secret 隔离TokenManager::scope('platform' | 'tenant')

M2B — 平台前端骨架 + 登录流程

  • platform/ 完整 Vue 3 SPA(新建,非从 admin/ 拷贝)
  • 登录页 + permission.guard 动态路由挂载
  • dashboard 占位(M2C 补 real content)

M2C — 平台业务模块 CRUD

  • Tenant CRUDtrial_days 字段 + 默认 30 天试用
  • Plan CRUD 带 bytes ↔ GB 转换 + features multiselect
  • PlanFeature CRUD
  • Dashboard 真实数据:stats cards(租户数 / 订阅数 / 收入)+ 7 天趋势图
  • API: platform/src/api/{tenant,plan,plan-feature,dashboard}.ts

M2D — 租户侧生命周期 UI

  • user.store 扩展 saas ref(包含 lifecycle_stateexpires_atgrace_untilfeatures 等)+ hasFeature() + lifecycleState computeds
  • tenant-header-alert.vue grace / frozen / disabled 警告 banner
  • v-feature 指令tenant/src/directives/feature.ts
  • tenant-profile/index.vue 只读租户信息页(含存储用量进度条)
  • subscription/index.vue M2D shell(M3D 替换为完整续费流程)
  • 红线测试 Test3/4/5/6 新增(总 6 个红线 test)

[0.1.0] - 2026-04-08

Added — M1 核心多租户机制

M1A — soft fork 准备 + 骨架

  • 从 ydadmin v1.5.1 soft fork 到 元点-Saas
  • 重命名 admin/tenant/ / adminapi/tenantapi/
  • 双远端(github + gitee)+ UPSTREAM-SYNC.md cherry-pick 协议

M1B — 核心租户机制

  • core/tenant/TenantContext 栈式 singleton(支持 runAs / runWithoutScope 嵌套)
  • core/tenant/TenantContextSnapshot 不可变视图
  • core/tenant/TenantResolver 子域名解析 + RESERVED_SUBDOMAINS
  • core/tenant/middleware/TenantContextMiddleware / PlatformContextMiddleware / TenantStatusMiddleware
  • core/base/Repository 基类新增 query() 方法,自动注入 where('tenant_id', ctx.id())create() 自动填 tenant_id
  • core/auth/TokenManager 重构为 ::scope(...) 工厂方法 + 双 JWT secret 支持

M1C — SaaS 数据模型 + CLI

  • 3 张核心表tenants / plans / plan_features
  • Tenant model with lifecycle_state 计算属性
  • Plan model with features JSON cast
  • PlanFeature model(显式 $deleteTime = false,无 deleted_at 列)
  • PlatformAdmin model
  • CLI saas:create-platform-admin
  • 红线测试 Test1(跨租户列表隔离)+ Test2(跨租户 ID 注入防御)

Upstream ydadmin 版本历史

以下为 upstream yuandianxitong/ydadmin 的版本历史,通过 scripts/sync-upstream.sh 定期 cherry-pick 到本 SaaS fork。

[1.5.1] - 2026-04-07

Added

后端 (server)

  • 新增 MenuChangedListener,统一处理菜单相关操作后的缓存失效

Changed

后端 (server)

  • createMenu/updateMenu/deleteMenu/batchDeleteMenu/batchSort 成功后触发 menu.changed 事件
  • MenuRepository 移除缓存失效副作用,迁移至 MenuChangedListener
  • 移除 MenuRepository 中无调用方的 deleteWithChildren 和已废弃的 collectChildrenIds 方法

Admin 前端 (admin)

  • 菜单表单改造为单列布局,dialog 宽度收窄至 600px,组件路径输入框添加前后缀 UI 提示

Fixed

Admin 前端 (admin)

  • 修复菜单新增/编辑/删除后列表缓存未失效、页面不刷新的问题
  • 修复 IconSelect SVG 图标 glob 路径错误导致 SVG tab 一直空白的问题
  • 修复 IconSelect popoverWidth prop 传入百分比时 popover 撑满视口的问题

[1.5.0] - 2026-04-07

Added

后端 (server)

  • core\base\Service:新增 extractPagination()findOrFail()runInTransaction() 三个基类方法
  • core\base\Repository:新增 buildPagination() 统一分页响应构造
  • core\base\Model:新增默认 getStatusTextAttr() 实现
  • 新增 AbstractLedgerLogRepository 账目流水抽象基类(BalanceLog/PointsLog 复用)
  • MessageService::sendToUser():封装按用户 ID 发送模板消息
  • RoleService::batchDeleteRole()DictionaryService::batchDeleteDictionary():批量删除带事务
  • AdminService::batchDeleteAdmin():批量删除带事务
  • 代码生成器生成的 Model 自动包含 $append = ['status_text'] 声明
  • CronJobService 命令白名单 + Console::call 进程内调用替代 exec
  • 新增语言键:wechat_open_platform_not_configured / wechat_auth_failed / cron_command_empty / cron_command_not_allowed

Admin 前端 (admin)

  • 新增 hooks/useListPage.ts:列表页通用 composable(分页/搜索/删除/批删/状态切换)
  • 新增 hooks/useFormDialog.ts:表单弹窗通用 composable
  • 新增 utils/createCrudApi.ts:标准 CRUD API 工厂
  • 新增 styles/crud-layout.scss:全局列表页布局样式
  • 新增 constants/options.ts:状态选项 hooks(useStatusOptions)
  • 错误页面白名单含 404/500,loadRouteView 找不到组件时降级到 404

移动端 (uniapp)

  • 新增 hooks/useCountdown.ts:SMS 倒计时 composable
  • 新增 hooks/usePagingList.ts:自动注册 onShow + onPullDownRefresh
  • 新增 hooks/useMessageList.ts:消息列表共享逻辑 + messageCache 跨页面传递
  • 新增 utils/time.ts:日期格式化工具(formatDate/formatDateTime/formatRelativeTime)
  • 新增 utils/platform.ts::getStatusBarHeight():状态栏高度封装
  • 新增 components/d-ledger-list/:账目/积分流水列表通用组件
  • 全局样式新增 .d-submit-btn / .d-section-card / .d-section-title

Changed

后端 (server)

  • 分层架构合规:UserService 多处直接 Model 操作迁至 Repository
  • User Model 删除静态查询方法(findByMobile/findByOpenid/findByMiniOpenid),逻辑迁至 UserRepository
  • AdminLoginLog/AdminOperationLog 静态 record 方法迁至 Repository
  • SystemConfig 静态查询逐步迁移至 Repository(保留 core 层使用的静态方法,避免反向依赖)
  • MenuRepository.getAllChildrenIds 改为"一次全量查询 + BFS"消除 N+1
  • NotificationRepository.markAsRead/markAllAsRead 改为批量 SQL 消除 N+1
  • AlipayDriver create() 返回结构改为嵌套 data 字段,与 WechatPayDriver 对齐
  • AdminController/MenuService.batchDelete 加事务包裹
  • Listener 全部改为构造函数 DI(FeedbackCreated/UserRegister/PaymentSuccess/MessagePush/AdminLoginSuccess/AdminLoginFailed)
  • DashboardService 删除 getRelativeTime,统一使用 DateHelper::diffForHumans
  • ArticleCategoryService/DepartmentService 删除 buildTree,统一使用 ArrayHelper::toTree
  • upload 路由添加 admin_log 中间件
  • DashboardService 删除重复字段 newAdmins/newRoles/newMenus
  • Admin Model 移除冲突的 setPasswordAttr,密码 hash 统一在 Service 层
  • AuthController.wechatWebLogin 下沉至 UserService,使用 Guzzle 替代 file_get_contents
  • 8 个 Service 应用 extractPagination 消除分页参数解构样板
  • 5 处 findOrFail 替换样板代码
  • UserManageService.adjustBalance/adjustPoints 改用 runInTransaction
  • UserRepository.updateLastLogin 用 Db::raw 实现 login_count 原子自增

Admin 前端 (admin)

  • 22 个列表页迁移到 useListPage(admin/role/department/cron-job/notification/dictionary/log×2/permission/file/announcement/agreement/article/article-category/feedback/region/version/auto-reply/balance-log/points-log/user/message-log/message-template)
  • 15 个 Form 组件迁移到 useFormDialog
  • v-has-perm 改用 removeChild 完全从 DOM 移除元素
  • API 类型定义集中到 types/api.d.ts(UserItem/BalanceLogItem/PointsLogItem)
  • usePaging 修复 res.data.list 数据解构对齐
  • settings.store 清理 @ts-ignore,改用 $patch
  • i18n 补全 feedback/article/article-category/announcement 等模块,合并 userMgmt.common.* 到顶层 common.*
  • 首页快速导航重新排版

移动端 (uniapp)

  • LoginResult 类型字段从 user 改为 user_info(与后端对齐)
  • user.store 新增 register 方法封装注册流程
  • balance.vue/points.vue 接入 d-ledger-list
  • register.vue 接入 useCountdown,移除手动 timer 管理
  • announcement-list 接入 usePagingList 自动注册生命周期
  • my/index.vue 头部高度通过 createSelectorQuery 动态测量替代硬编码
  • settings.vue 接入真实的 useVersionCheck,删除假"检查更新"实现
  • wechat-oauth 存储改用 uni.getStorageSync 跨端兼容
  • upload.ts BASE_URL 与 request.ts 对齐(H5 DEV 代理)
  • d-wechat-login 移除废弃的 uni.getUserProfile 调用
  • 安全区域适配修复(加 env(safe-area-inset-bottom))
  • usePaging 新增 hasLoaded 状态供空状态组件防闪烁

PC 网站 (pc)

  • 余额充值流程支持支付宝 PC page 支付(DOMParser 解析表单 + 新窗口手动提交)

Fixed

后端 (server)

  • 修复 CodeGeneratorService.getTableColumns SQL 注入风险(白名单校验)
  • 修复 FileService.deleteFile 物理文件删除失败未记录日志
  • 统一 SystemConfigService 异常类为 BusinessException

Admin 前端 (admin)

  • 修复 file/index.vue 模板语法错误导致页面无法加载

移动端 (uniapp)

  • 修复 balance.vue 支付字段名 payment_data 类型
  • 修复 usePaging 初始 loading=true 导致 getList 阻塞(改为 hasLoaded 方案)
  • 修复 useMessageList 从 modules 子包移到 hooks 主包(修复主包不能引用子包的限制)

Removed

Admin 前端 (admin)

  • 移除 ThemePicker 组件及 theme/apply.ts 遗留代码

移动端 (uniapp)

  • 移除 profile.vue 孤儿页面

[1.4.0] - 2026-04-05

Added

  • 新增 CacheableRepository Trait,Repository 层声明式缓存抽象
  • 新增 Redis 队列异步处理(操作日志、消息通知)
  • 新增 log:archive 命令,定期清理过期管理员日志
  • 新增前端 useDebounceRequest Hook,搜索请求防抖
  • 新增前端 GET 请求去重机制

Changed

  • 缓存驱动由 file 切换为 Redis
  • 字典数据增加 7200s Redis 缓存
  • 菜单树增加 3600s Redis 缓存
  • SystemConfigRepository / Permission 缓存迁移到标签化管理
  • 操作日志由同步写 DB 改为异步队列
  • 消息通知由同步 API 调用改为异步队列
  • 余额/积分日志改用 eager loading,消除 enrichListWithNames 额外查询
  • AdminRepository.getDetailWithPermissions 改用 eager loading 消除 N+1
  • 前端删除 Auth Guard 冗余 menuApi.getAdminRoutes() fallback 请求

Fixed

  • 修复 admin_login_logs 缺少 (admin_id, login_time) 复合索引

[1.3.0] - 2026-04-01

Added

  • API 文档支持后台管理 API / 前端应用 API 切换,C 端 11 个控制器添加 OpenAPI 注解
  • UniApp 注册页新增手机短信验证码(与 PC 端注册流程统一)

Changed

  • UniApp 微信快捷登录按钮改为圆形绿色微信图标
  • UniApp 引入 iconify 图标系统(@iconify-json/ri + presetIcons)
  • 重构 Controller/Service/Repository 分层,消除架构违规(Controller 不再直接调用 Model,Service 不再绕过 Repository)
  • Menu/Permission Model 查询逻辑迁移至 Repository 层
  • AdminLogMiddleware 改用 Repository 记录操作日志
  • 统一 Repository 调用风格($this->getModel()::$this->model->
  • RequestCodeEnum 更新为与后端一致的 HTTP 状态码(200/400/401/403/500)
  • 超级管理员权限标识前后端对齐(后端注入 '*' 通配符)
  • 事务 catch 类型统一为 \Throwable(RoleService、AdminService、DictionaryService)
  • MessageLog Model 改为继承 core\base\Model
  • ConfigInfo TypeScript 类型定义与实际 API 响应字段对齐
  • app.store.getConfig() 返回值统一为 config 数据对象

Fixed

  • 修复开放平台配置保存成功但刷新后值为空(system_configs 缺少 wechat_open 组初始数据)
  • 修复 batchUpdateConfigs() 对不存在的配置键静默跳过,改为抛出异常提示具体键名
  • 修复异常类在 PHP 8.4 下隐式 nullable 参数弃用警告(BusinessException、ApiException、PermissionException)
  • 修复 server/public/static/fonts 未纳入 git 版本控制
  • 补充英文语言包缺失的 config_group_wechat_open 翻译
  • 修复 Upload 组件响应码检查(code == 1code == 200),错误消息字段(msgmessage
  • 修复上传路由重复定义(移除 common.php 中多余的 upload 路由组)
  • 修复超级管理员 v-hasPerm 指令不生效(后端未向前端发送 '*' 权限标识)
  • 修复 21 个 Model 缺少 $append 声明导致访问器字段不出现在 API 响应
  • 修复日志 Model 缺少 $updateTime = false(AdminLoginLog、AdminOperationLog)
  • 修复静默吞掉异常的 catch 块(FileService、CodeGeneratorService、UploadController),改为 Log::warning
  • 修复 api-doc 页面硬编码 localStorage key 获取 token
  • 修复 workbench 页面 v-for + v-if 同元素(Vue 3 不允许)
  • 修复 Vite 开发模式新页面首次访问触发依赖重优化整页刷新(改用动态解析组件样式路径)
  • 修复 Dashboard stats 接口报 "Undefined array key 'login_result'"(AdminLoginLog 访问器加 isset 防御)
  • 修复多个 Model 访问器在字段缺省时抛出 "Undefined array key" 警告(Admin、Role、Menu、Dictionary、DictionaryItem、Permission、BalanceLog、PointsLog)

Removed

  • 移除重复的消息模块视图(views/message/,保留 views/system/message/
  • 移除未使用的路由 guard 文件(router/guards/init.ts
  • 移除死代码:getWorkbench()getGlobalConfigs()ThemePicker/demo.vue
  • 注册 3 个孤立事件到 event.phpannouncement.createdarticle.createduser.notification.created

[1.2.1] - 2026-03-28

Added

  • 新增系统版本配置文件 server/config/version.php
  • 新增数据库升级目录 server/database/updates/ 及通用升级指南
  • 新增 v1.2.1 数据库升级脚本(权限系统修复)

Changed

  • CLAUDE.md 新增发版数据规范章节

Fixed

  • 修正菜单权限命名不一致(type=2 菜单添加 .list 后缀)
  • 补充缺失的 type=3 按钮菜单权限
  • 为超级管理员角色分配新增按钮权限

Removed

  • 移除 server/public/install/data/fix_permissions.sql(内容已合并至 init.sql 和 updates/v1.2.1)

[1.2.0] - 2026-03-24

Added

  • 仪表盘新增「最近活动」和「活跃用户排行」数据端点(/adminapi/dashboard/recent-activities/adminapi/dashboard/active-ranking
  • DashboardRepository 新增用户统计、排行榜、最近活动查询方法
  • DashboardService 新增用户注册/活跃统计、最近活动聚合、活跃排行逻辑

Changed

  • 仪表盘前端整体重设计:渐变玻璃态风格(gradient glassmorphism)
  • KPI 卡片调整为冷色系渐变配色(左亮右暗)
  • 移除系统信息卡片,快捷导航扩展为 4×2 网格布局
  • 简化仪表盘整体布局,放大关键数字排版
  • 移除仪表盘区域背景色覆盖
  • 更新仪表盘相关 TypeScript 类型定义与 API 函数
  • 更新仪表盘 i18n 多语言翻译

Fixed

  • 修复仪表盘中 appStore 属性名引用错误

[1.1.0] - 2026-03-23

Added

  • 微信支付多端适配:小程序 JSAPI、公众号 JSAPI、H5 MWEB、APP、PC Native 五种支付方式自动路由
  • 客户端平台识别:X-Client-Type 请求头(miniapp/wechat_h5/h5/app/pc),后端白名单校验
  • 多 AppID 支付配置:按平台自动选择小程序/公众号/开放平台/移动应用 AppID
  • JSAPI/APP 支付参数二次签名:buildJsapiParams()buildAppParams() 方法
  • 微信平台证书自动下载与缓存(无需手动配置 cert_path)
  • 小程序微信快捷登录 + 手机号绑定(wechatQuickLoginwechatBindPhone 接口)
  • H5 公众号 OAuth 静默授权获取 oa_openid(wechat-oauth.ts
  • H5 微信浏览器 WeixinJSBridge 调起支付
  • PC 端充值二维码展示 + 轮询支付状态(qrcode 库)
  • 用户表新增 oa_openid 字段,支付订单表新增 client_type 字段
  • 注册成功后自动登录(token + userInfo 同步写入 store)
  • notify_url 支持相对路径,运行时自动补全域名

Changed

  • PaymentManager::getWechatConfig() 改为 public,新增多端 appid 配置加载
  • WechatPayDriver::create() 支持动态 appid 参数
  • WechatPayDriver::query() 使用 URI 模板避免订单号大写被 normalize 转义
  • PaymentService::createOrder() 存储 client_type 到订单记录
  • UserController::recharge() 根据客户端类型自动路由支付方式
  • PaymentController::query() 不再强制要求 channel 参数,自动从订单记录获取
  • WechatController::oauthCallback() 支持 SPA 重定向模式和 JSON 模式
  • OfficialAccountService::getUserByCode() 返回 unionid 字段

Fixed

  • 修复微信支付未启用时返回 500 错误(改为友好提示)
  • 修复微信支付 V3 SDK certs 参数为空导致初始化失败
  • 修复微信 WXSS 编译错误(UnoCSS presetUno → presetWeapp)
  • 修复发现页 tabs 四周边距不合理及多余 scroll-view
  • 修复 H5 微信 OAuth 死循环(前端直接处理 code 参数)
  • 修复 el-tree-select value 属性 TS 类型错误(改用 node-key
  • 修复 el-tag type 属性 TS 联合类型不匹配
  • 修复微信支付查询订单号大写被转为 kebab-case(W → -w)
  • 修复 ORDER_NOT_EXIST 轮询报错暴露给用户(静默返回 pending)

[1.0.0] - 2026-03-20

Added

Admin 后台管理

  • 基于 Vue 3 + TypeScript + Element Plus + Vite + Pinia 的管理后台
  • 动态路由系统,通过后端菜单数据自动生成
  • 用户管理、角色权限、菜单管理
  • 文章管理(分类、标签、封面、富文本编辑)
  • 公告管理、反馈管理、协议管理
  • 系统配置(站点设置、上传配置、支付配置等)
  • 余额记录、积分记录管理
  • 控制台仪表盘(统计卡片、登录趋势图表)
  • 操作日志、登录日志
  • 代码生成器(自动生成 CRUD 全栈代码)

Server 后端服务

  • 基于 ThinkPHP 8 + PHP 8.0+ 的 RESTful API 服务
  • 分层架构:Controller → Service → Repository → Model + Listener + Job
  • 自动依赖注入(DI)
  • JWT 认证与 RBAC 权限控制
  • 支付系统(微信支付、支付宝)
  • 余额/积分体系
  • 消息通知系统(站内信、短信)
  • 事件驱动的副作用处理(Listener 机制)
  • 文件上传(本地、阿里云 OSS、腾讯云 COS、七牛云)
  • 安装向导(含演示数据与动态 URL 替换)
  • 开放平台(OAuth 第三方登录)

PC 前台网站

  • 基于 Nuxt 3 (SPA) + Naive UI + UnoCSS 的前台网站
  • 文章列表与详情(分类筛选、标签、阅读量)
  • 用户中心(个人资料、密码修改、余额充值、积分明细)
  • 登录注册(密码、短信、微信扫码)
  • 全局错误页面(404/500)

UniApp 移动端

  • 基于 uni-app + Vue 3 + wot-design-uni 的移动端应用
  • 首页(轮播图、公告栏、功能入口、最新文章)
  • 发现页(文章分类筛选、下拉刷新、上拉加载)
  • 消息中心
  • 个人中心(资料编辑、余额、积分)
  • 文章详情(富文本渲染、标签展示)
  • 反馈、公告、协议页面

最后更新于:

基于 Apache-2.0 协议开源