承接第四篇纯后台业务 Bug 复盘,本篇为联动踩坑上篇,主要覆盖学员 C 端自身缺陷、预约提交、课时套餐跨端同步、本地缓存引发的数据不一致、消息通知异常。 教师端联动、核销爽约、定时任务、并发、弱网问题统一放到第六篇;底层安全、分包、PC 管理 Demo 放到第七篇。 全部案例来自三端整体功能测试,采用现象 → 根因分析 → 修复方案 → 开发启示结构。

一、预约流程前后台联动踩坑

坑 1:后台代预约成功,学员端预约列表不自动更新

现象:管理员后台完成代预约,数据库预约记录已生成;学员打开小程序「我的预约」看不到新增记录,必须手动下拉刷新才展示。

根因:学员端预约页面只在页面初次加载请求接口,页面驻留复用旧缓存;后台代预约属于外部变更,小程序客户端无法收到变更推送。

修复方案

  1. onShow生命周期每次进入页面强制重新请求接口,不复用页面内存缓存;
  2. 短轮询作为兜底方案;
  3. 代预约完成下发微信订阅消息,引导用户刷新查看。                 

开发启示:B 端后台修改用户业务数据,小程序客户端无感知;涉及用户业务资产页面,onShow 阶段务必拉取最新服务端数据。

坑 2:后台手动取消预约,学员端课时没有返还

现象:管理员后台取消学员有效预约,预约状态更新为已取消,但冻结课时没有回退,学员端课时数值不变,造成课时虚假消耗。

根因:只有学员自己在小程序取消预约实现了课时返还逻辑;后台取消预约只修改预约状态,没有调用课时回滚逻辑,两套入口业务逻辑割裂。

修复方案:抽离公共cancelAppointment()工具函数,学员端主动取消、后台管理员取消预约,统一调用该函数,完成「修改预约状态 + 返还冻结课时 + 写入课时流水」整套逻辑。

开发启示:同一个业务动作存在多端入口,禁止分别写两套业务代码,抽公共函数保证行为完全一致。

坑 3:课程后台下架,历史预约跳转课程详情页报错

现象:管理员后台将课程下架;学员存在该课程的历史有效预约,从我的预约点击跳转课程详情,页面直接报错,无法查看预约相关信息。

根因:课程详情接口统一做 “仅上架课程可访问” 过滤;但历史预约记录仍然持有该课程 ID,历史预约场景需要允许访问已下架课程基础信息。

修复方案:接口增加来源标记;如果来自预约记录跳转,跳过课程上下架过滤,仅展示课程基础信息;普通浏览场景依旧过滤下架课程。

开发启示:业务下架≠全场景禁用;历史订单、历史预约要兼容访问已逻辑删除 / 已下架主数据。

坑 4:后台修改排班最大容纳人数,学员端剩余名额不同步

现象:后台修改排班最大上课人数,例如由 10 改为 15;学员端预约页面依旧展示旧剩余名额,显示名额已满实际还有空位。

根因:排班数据在学员端做了本地缓存;后台变更排班后没有清除客户端缓存,前端直接读取缓存数值计算剩余名额。

修复方案

  1. 排班、名额这类动态可变数据,客户端不做持久 storage 缓存,每次进入预约页面实时拉取排班完整信息;
  2. 后台更新排班时打变更标记,客户端识别标记主动刷新。

开发启示:后台会频繁变更的业务字段,前端不要做长期本地缓存,展示以服务端返回为准。

坑 5:学员端同一时间段可以重复提交预约

现象:学员没有退出页面,短时间连续点击预约按钮,或者打开两个页面同时预约同一时段,可生成多条同一时间段预约记录,出现时段冲突。

根因:前端缺少按钮防抖;后端虽然有单用户时段冲突校验,但早期版本接口校验存在漏洞;连续快速请求并发下校验判断失效。

修复方案

  1. 前端增加按钮防抖,提交期间置灰按钮禁止重复点击;
  2. 后端增加数据库层面用户 + 时间段唯一约束,无论请求多快,同一用户同一时段不能生成多条预约。

开发启示:前端防抖只能优化交互,并发场景必须后端数据库层面做唯一性防护。

坑 6:课时充足,但学员提交预约提示课时不足

现象:学员套餐还有剩余课时,但是提交预约返回 “剩余课时不足”;查看数据库课时数字是正确的。

根因:学员端读取本地缓存的课时数值做预判断,缓存是旧值;真正扣减时读取数据库真实课时,中间发生其他核销消耗,缓存与数据库不一致。

修复方案:前端仅做交互提示,预约能否通过完全交给后端接口校验;后端实时查询数据库套餐剩余课时,不接收前端传入的课时数字。

开发启示:课时、余额类资产,前端仅做展示参考,业务判断全部交给后端。

二、套餐与课时跨端同步踩坑

坑 7:后台给套餐做延期,学员端展示过期时间还是旧值

现象:管理员后台对学员套餐执行延期,数据库 expireTime 已更新;学员个人套餐页面依旧显示旧的过期时间。

根因:学员端个人中心套餐数据存入 storage 本地缓存,页面优先读取缓存,没有每次进入重新拉取。

修复方案:课时、套餐有效期属于核心资产,进入个人资产页面 onShow 强制请求后端接口,放弃本地 storage 缓存;仅非核心静态内容做缓存。

开发启示:用户资产类数据禁止依赖前端本地缓存,一切以数据库为准。

坑 8:后台冻结套餐,学员端依旧可以发起预约

现象:后台将学员套餐冻结;学员小程序端仍然可以提交预约。(第四篇已经修复后台核销入口,本坑为 C 端预约联动问题)

根因:后台修改套餐冻结状态只更新数据库;学员端缓存了旧的套餐状态,提交预约时使用缓存状态;后端接口早期没有二次校验套餐状态。

修复方案

  1. 预约接口后端实时查询数据库最新套餐状态,不接受前端传递的状态;
  2. 进入预约页面 onShow 清除套餐缓存,重新拉取套餐信息。

开发启示:任何关键业务接口,后端必须读取数据库实时状态,不能信任前端传参。

坑 9:后台新增课时套餐,学员端看不到套餐新增对应的流水记录

现象:管理员后台给学员新增课时套餐,课时数量正常生效;学员端课时消费流水列表没有这条套餐新增记录。

根因:流水写入只处理核销、撤销场景;后台手动新增套餐、套餐延期等资产变更场景漏调用流水写入函数。

修复方案:统一封装课时流水写入公共函数;套餐新增、延期、冻结、核销、撤销、预约扣减、预约返还全部场景统一调用,记录操作来源、操作人。

开发启示:只要学员课时资产发生变化,无论来自后台还是学员端,都必须写入课时流水,做到每一笔变动可追溯。

三、后台代预约、消息通知联动坑

坑 10:后台代预约可以选择已经过期排班,生成无效预约记录

现象:管理员后台代预约接口没有校验排班是否过期,可以给学员对过期排班创建预约;学员端我的预约出现大量过期无效预约。普通学员自主预约会拦截过期排班。

根因:代预约接口复用部分参数,没有复用学员预约的全套前置校验逻辑,管理员身份跳过部分业务约束。

修复方案:代预约接口完整复用学员预约校验集合:排班有效性、是否满员、套餐冻结状态、课时余量全部复用同一套校验规则,管理员身份不放宽业务条件。

开发启示:后台代用户执行业务,校验标准不能降低,和 C 端用户执行完全一致约束。

坑 11:后台代预约成功,学员收不到预约提醒订阅消息

现象:后台代预约完成,预约记录生成;学员收不到微信预约服务通知;学员自己在小程序预约消息推送正常。

根因:消息推送只写在学员自主预约分支;后台代预约业务分支没有调用消息下发工具。

修复方案:抽离预约成功消息推送公共方法;学员自主预约、后台代预约完成后统一调用,下发预约提醒。

开发启示:同一业务结果由多入口触发,通知、事件逻辑统一封装,防止分支遗漏。

四、学员端自身功能 Bug

坑 12:课程详情页左上角返回按钮偶发失效无法点击

现象:学员端进入课程详情页面,部分场景左上角返回按钮点击无响应,无法回退上一页。

根因:页面路由栈异常;部分跳转逻辑使用redirectTo替换页面,栈内无上级页面,返回事件绑定异常。

修复方案:统一页面跳转规范;合理使用 navigateTo/redirectTo;返回按钮做兜底判断,如果无历史栈直接跳转到课程列表页。

开发启示:小程序页面路由栈很容易出现异常,返回按钮不能单纯依赖原生navigateBack,要做栈为空的兜底逻辑。

坑 13:未登录状态下,学员端评价页面可以直接执行评价提交

现象:清除登录态,直接打开评价页面,依然可以提交评价内容。

根因:仅页面层做登录拦截;提交评价接口没有做鉴权校验,未登录请求可以直接写入评价数据。

修复方案:评价提交接口增加登录鉴权校验;未登录直接拦截返回错误码,前端收到错误跳转登录页。

开发启示:页面登录拦截只是体验,接口层必须再做鉴权,防止直接调用接口越权操作。

坑 14:超时未上课预约,学员端我的预约状态不会自动变更

现象:排班已经超时结课,云开发定时任务已经更新数据库预约状态;学员不手动下拉刷新,「我的预约」列表依旧显示 “未上课”。

根因:学员端我的预约页面只在打开时拉取一次数据,页面驻留不会自动同步定时任务变更后的状态。

修复方案

  1. onShow 每次进入重新拉取预约列表;
  2. 对于长时间驻留页面,增加低频率轮询,同步定时任务带来的状态变更。

开发启示:定时任务在服务端修改数据,客户端完全无感知,页面每次显示必须重新拉取。

五、第五章通用开发启示

  1. 后台对用户业务数据做变更,小程序客户端不会自动感知;预约、课时、套餐这类资产页面,onShow 生命周期务必重新请求服务端,不要依赖内存或 storage 缓存。
  2. 同一业务多端入口,必须抽离公共业务函数,保证学员端操作、后台代操作行为完全一致,避免逻辑分裂。
  3. 后台管理员代用户操作,校验标准不能低于普通用户,管理员身份不能跳过业务约束。
  4. 下架、过期、冻结等状态变更,要考虑历史预约、历史订单访问兼容,不能一刀切全部拦截。
  5. 用户资产相关判断,后端必须读取数据库实时状态,严禁信任前端缓存、前端传入参数。
  6. 只要课时资产发生变动,无论操作来源,必须写入课时流水,保证资产全链路可追溯。
  7. 小程序路由栈容易异常,返回、跳转逻辑需要做兜底处理;页面拦截不等于接口鉴权,所有写操作接口必须做鉴权。

本章主要覆盖预约、课时、缓存、消息通知、学员端自身功能缺陷。

核销爽约、教师端‑后台联动、定时任务细节、并发、弱网、视图渲染等全部放到第六篇;

第四篇为纯后台内部 Bug;

第七篇处理安全、分包、PC Demo。

本文属于《全栈项目实战手记|艺培场馆课时预约小程序》专栏,系列持续更新,可订阅专栏阅读完整连载。

连载目录回顾

第一篇:艺培场馆课时预约小程序 B 端管理后台完整产品设计思路

第二篇:艺培场馆课时预约小程序 C 端学员端完整产品设计思路

第三篇:艺培场馆课时预约小程序后台、教师端、学员端实拍与业务流程图汇总

第四篇:艺培场馆课时预约小程序后台开发踩坑复盘(课程、学员、权限配置类 Bug)

第五篇:艺培场馆课时预约小程序用户端 & 后台联动踩坑上篇(预约、课时、同步问题)

第六篇:艺培场馆课时预约小程序用户端 & 后台联动下篇(排课核销、定时任务、页面交互异常)

第七篇:艺培场馆课时预约小程序 V2.0 底层安全、交互、分包全量迭代复盘

第八篇:艺培场馆课时预约小程序 PC 管理端 Demo 完整开发成果展示

第九篇:艺培场馆课时预约小程序全项目开发历程完整复盘总结

Logo

一站式 AI 云服务平台

更多推荐