体检预约小程序这个题目,这些年几乎稳坐毕业设计热门选题的前排位置。原因很直接:微信小程序本身就是当前最主流的小程序形态,而体检预约又属于典型的“流程清晰、角色分明、闭环完整”的业务场景,做出来有辨识度,也好讲、好答辩。我最近刚带学生把一个“基于微信小程序的大学生体检预约系统”从源码到文档完整过了一遍,今天就把这个项目的设计思路、核心代码逻辑、环境搭建、远程调试技巧以及答辩时容易被追问的问题,一次性拆开讲清楚。这篇文章适合正在选毕设题目、手里刚拿到一套源码不知道从哪下手、或者想自己从零肝一个体检预约小程序的同学。不管你是纯前端小白,还是只懂后端不懂小程序,按下面的步骤走,基本都能把一个能演示、能答辩、能拿得出手的项目完整跑起来。
1. 这个毕设到底在做什么:体检预约小程序的核心设计思路
1.1 为什么体检预约天然适合做成小程序
先想清楚一个问题:为什么这么多毕设选题里,体检预约系统的出镜率这么高?因为它的业务模型足够“标准”,又不至于太简单。医院校医院或者体检中心,每天要做体检的人很多,如果全部线下排队,现场会非常乱。传统的人工预约方式,登记台要记姓名、记电话、安排时间,效率低还容易出错。小程序解决的核心痛点就是:用户在自己手机上就能看到体检套餐、选择日期和时间段、填好个人信息、生成预约单;管理员在后台能看到所有预约记录、统计每天的人流量。这个流程覆盖了“用户端 + 管理端 + 数据存储”三条线,是典型的全栈小项目,非常适合当作毕设。
选小程序而不是Web网页,还有一个实际原因:不用引导用户下载App。微信里面打开即用,登录也直接走微信授权,对大学生这个高频使用微信的群体来说,使用门槛几乎为零。而且微信官方提供的开发者工具、云开发、真机调试这些能力,能让你一个人在没有服务器的情况下把前后端都做完,这对毕设项目来说是压倒性的优势。
1.2 功能模块拆解:从用户和管理员两个角度切入
这个项目的功能并不复杂,但必须拆得清楚。站在用户侧,核心动作就是一个“预约动作流”:浏览体检套餐 → 选择套餐 → 添加到预约单 → 填写体检人信息(姓名、电话、身份证等)→ 选择体检日期和时间段 → 提交预约 → 在我的预约里查看或取消。站在管理员侧,核心是:维护体检套餐信息(增删改查)、查看所有预约记录、按日期状态筛选、统计某个日期某个体检项目的预约人数,方便安排医护人员。
在实际的项目文档里,这套功能通常被划分成这些模块:
| 模块 | 用户端功能 | 管理员端功能 |
|---|---|---|
| 首页模块 | 展示体检套餐列表、套餐详情 | 管理套餐上下架、修改套餐内容 |
| 预约模块 | 选择日期时间段、填写体检人信息、提交预约 | 查看全部预约、按状态筛选、确认或取消预约 |
| 个人中心 | 查看我的预约、取消预约、查看个人信息 | 个人信息维护、权限管理 |
| 数据统计 | 无 | 按日期统计预约人数、按套餐统计热门项目 |
这里要注意,很多同学做功能时会陷入一个误区:拼命堆功能。实际上,毕设得分的核心不在于功能多,而在于每个功能都要形成“闭环”。比如“取消预约”,用户取消了之后,管理端要能看到状态变成“已取消”,数据库里的对应记录也要更新,前端页面要给出提示。这个完整的链路比做十个花哨但没闭环的功能更值得写进文档里。
1.3 技术选型:为什么推荐原生小程序 + 微信云开发
技术选型是文档里分值很高的一部分,也是答辩老师必问的点。这个项目我建议采用的是:原生微信小程序 + 微信云开发(cloud development)。说的直白一点,原生小程序就是不用uniapp、不用Taro,直接用微信自己的语法(WXML、WXSS、JS、JSON)写页面逻辑。云开发则是微信提供的一套“后端全家桶”,包括云数据库、云函数、云存储。
为什么这个组合最适合毕设?
第一,部署成本低。云开发不需要你自己买云服务器、不需要配置域名、不需要搞HTTPS证书。你只需要在微信开发者工具里点几下“开通云开发”,系统会自动给你分配一个云环境,里面包含了数据库和云函数运行环境。这对很多没有后端经验的同学来说,直接省掉了整个服务器运维的学习成本。
第二,身份认证简单。小程序要识别用户是谁,传统方案需要自己写一套登录接口,用session、token管理登录态,对新手非常不友好。云开发天然集成了微信的登录能力,云函数里可以直接获取用户的openid(用户在小程序里的唯一标识),不用自己维护登录状态。
第三,数据权限控制方便。云数据库不需要你写SQL,它是一套类似MongoDB的文档型数据库,每条记录就是一个JSON对象。你可以通过简单的权限设置,指定“只有创建者能读写自己的记录”,或者“所有人可读,仅创建者可写”。这个在后面管理预约记录时会非常实用。
当然,如果你自己已经熟悉Spring Boot或Node.js,也可以选择用自己的后端,小程序端通过 wx.request 去请求接口。但说实话,对于大部分只需要完成毕设、想快速跑通项目的同学,云开发是更省力的选择。文档里只要把选型理由写清楚,老师不会因为你没用传统后端而扣分。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心技术细节拆解:登录、数据库、预约逻辑
2.1 微信登录的完整流程与高频报错分析
登录功能是这个小程序的门面,也是很多同学的第一步坎。微信小程序的登录流程并不复杂,但坑是真的多。标准流程是这样的:小程序前端调用 wx.login() 获取一个临时凭证 code,这个code的有效期非常短(5分钟左右),需要把它传给后端;后端用这个code调用微信接口,换取用户的 openid 和 session_key;然后把这个 openid 作为用户的唯一标识存到数据库里。
在云开发的项目里,这个过程更简单:你不需要自己拿着code去请求微信接口,你只需要在小程序端调用 wx.cloud.callFunction 传入一个云函数的名字(比如 login),然后在云函数里用云开发自带的 cloud.getWXContext() 方法,直接拿到调用者的 openid。整个过程不需要自己管理session,也不需要自定义登录态。
这个过程中,有几个高频报错值得拿出来单独说。
第一个就是网上经常有人贴出来的“小程序获取登录后的微信用户失败 wx1cb4398e1413dce7”之类的报错。这串字符实际上是某个小程序AppID对应的错误码,指向的问题通常是:你用当前这个AppID编译小程序时,没有在微信公众平台配置对应的用户隐私保护指引,或者AppID本身没有通过认证。现在微信对于用户头像昵称获取、手机号获取这些涉及隐私的接口,都需要在公众平台填写“用户隐私保护指引”并且审核通过后,前端调用才会正常。如果遇到这个报错,先别急着改代码,去微信公众平台上的「设置 -> 服务内容声明 -> 用户隐私保护指引」里,把你用到的接口(比如头像昵称填写、手机号快速验证、位置信息等)都勾上并提交,等待审核通过后再试。
第二个高频问题是:开发者工具模拟器里能正常登录,但真机预览就报错。这个多半是“当前小程序未配置AppID”导致的。很多人用测试号或者游客模式开发,模拟器里一切正常,但真机要求必须有真实的小程序AppID。解决方法是到微信公众平台注册一个小程序账号(个人主体即可),拿到AppID,然后在开发者工具右上角的“详情 -> 基本信息”里替换掉原来的测试号。
第三个坑是关于获取用户信息的。早年间小程序可以用 wx.getUserInfo() 直接弹窗拿用户头像昵称,现在微信政策改了,这个方法基本废了。目前的标准做法是在页面上放一个 button,设置 open-type="chooseAvatar" 来引导用户选择头像,昵称通过一个 input 让用户自己填写。别小看这个改动,很多旧项目源码里还在用旧方法,跑到2025年的基础库上根本弹不出授权框。拿到一套旧源码时,最先要检查的就是这里。
2.2 数据库表结构设计:三张核心表撑起整个业务
云开发里的数据库是文档型的,集合(collection)的概念类似传统数据库里的表。这个体检预约小程序,核心集合只需要三张:用户表 users、体检套餐表 packages、预约记录表 appointments。表结构设计越简单,越容易讲清楚,也越容易写进文档里。
先看用户表,核心字段是 _openid(云开发自动写入,表示这条记录属于哪个用户)、nickName(昵称)、avatarUrl(头像)、phone(手机号)、createTime(注册时间)。这里要特别说明:在云开发中,前端向数据库写入数据时,系统会自动在记录里带上用户自己的 openid,字段名就叫 _openid,不需要自己手动去查一次再存。使用这个特性,前端可以直接往集合里插入数据,云数据库会自动标识归属权,权限设置成“仅创建者可读写”后,别人就看不到这条记录。
再看套餐表,字段包括 name(套餐名)、price(价格)、items(体检项目数组,比如肝功能、血常规、心电图等)、description(说明)、capacity(每天最大预约人数)、available(是否开放预约)。items这个字段设计成数组,是文档型数据库比较舒服的存法,不用像关系型数据库那样再拆一张子表。
最后是预约表,也是整个系统里最核心的一张表。关键字段包括:userId(关联用户)、packageId(关联套餐)、userName(体检人姓名)、phone(联系电话)、idCard(身份证号)、appointmentDate(预约日期)、timeSlot(时间段)、status(状态:待确认、已确认、已完成、已取消)、createTime(创建时间)。这里把体检人姓名直接冗余存进预约表,而不是通过userId去关联用户表查,是因为预约人可能是帮别人约的,名字和手机号应该以用户填写为准。
2.3 预约日期与时间段的设计:如何避免拥挤和超约
体检预约的核心逻辑中,日期和时间段的选择是最容易出问题的环节。很多同学的第一个版本是:用户随便选一个日期,预约表里记录一下就行了。但这样设计,管理员没办法控制每天接待多少人,做出来的系统缺乏真实业务感。
我在这个项目里采用的方案是:管理员在套餐里配置每天的总容量 capacity,同时系统预置三个时间段:上午8:00-10:00、上午10:00-12:00、下午13:00-15:00。每个时间段内部的剩余名额,不是单独建字段存的,而是每次预约提交时,实时统计“这个套餐、这个日期、这个时间段”下已存在且状态不是“已取消”的预约记录数量,如果达到某个上限,就提示“该时间段已约满,请选择其他时间”。
对应的核心思路是:用户选择日期时,前端用小程序原生组件 picker 的 mode="date" 实现日历选择。需要注意的是,date 类型的 picker 返回的日期格式是 “YYYY-MM-DD”,不是时间戳,也不是 “YYYY/MM/DD”。如果你在日期比较时直接把字符串拿来和 new Date() 的结果比较,会遇到字符串比较和日期比较不一致的问题。我建议在操作前统一转成时间戳再比较,比如 const selectedDate = new Date(e.detail.value).getTime(),这样逻辑清晰,也不会有跨时区问题。
至于“超约”这个并发问题,虽然理论上两个人同时抢最后一个名额会产生超卖,但对毕业设计来说,用“先查询再写入”的简单方案足够演示。如果你想做得更严谨,可以后端用事务,云数据库支持 runTransaction 方法,把“查数量 + 写预约”放在一个事务里执行,保证数据一致性。这个点写进文档里是加分项,答辩讲清楚即可。
2.4 表单校验与交互细节:别在细节上丢分
体检预约里的表单涉及姓名、手机号、身份证号,这些字段如果用户乱填,管理员线下都没办法联系到人。前端必须做基础校验,但要注意:小程序的表单校验策略和Web有区别,因为它没有HTML5自带的 required 属性,也没有浏览器默认的校验提示框,所有校验逻辑都得自己用JS写。
手机号校验是最简单的,正则一行搞定:/^1[3-9]\d{9}$/。身份证号校验稍微复杂一点,可以只做长度和格式校验,比如18位、前17位是数字、最后一位可能是数字或X。地址信息如果不需要,尽量别让用户填,表单字段越少填写率越高。提交按钮一定要加 loading 状态,防止用户双击重复提交。这个细节很多同学不做,但老师演示的时候如果发现点两次按钮生成了两条重复预约,非常掉价。
还有一个小细节:当用户选择的日期是当天时,系统要判断用户选择的时间段是否已经过期。比如现在是上午11点,用户选了今天上午10:00-12:00这个时间段,这种做法等于选了过去的时间,应该直接禁用。这个判断用时间戳和当前时间比较即可。
3. 实操过程:从拿到一套源码到完全跑起来
3.1 环境准备:账号、工具、AppID三者缺一不可
如果你手里已经有一套完整的源码,第一步不是急着打开代码看逻辑,而是先把环境搞定。需要准备三样东西:微信公众平台注册的小程序账号、微信开发者工具、一个属于自己的AppID。
注册小程序账号要去微信公众平台(mp.weixin.qq.com),选择“小程序”类型注册,个人主体就能注册,不需要营业执照,审核一般当天就能过。注册完成后,在「开发 -> 开发管理 -> 开发设置」里就能看到 AppID。注意:这个 AppID 是你这个小程序独一无二的身份标识,所有云开发资源、域名、用户数据都挂在这个ID下面。如果源码里带的 AppID 是别人的,你直接用肯定没法跑云开发,或者数据根本对不上。
微信开发者工具去官网下载稳定版即可,现在最新版本已经内置了云开发控制台、真机调试、性能分析等功能,不需要额外安装插件。下载完毕后,打开工具,选择“导入项目”,把源码目录整个导进去,填上你自己的 AppID,后端服务选择“微信云开发”。这里有个细节:如果你导入项目后没有看到“云开发”按钮,大概率是 AppID 不对,或者你还没在小程序后台给这个 AppID 开通云开发能力。
3.2 项目目录结构讲解:快速看懂源码的骨架
拿到一套不熟悉的源码,第一件事是看目录结构,而不是看页面代码。一个典型的小程序云开发项目,目录通常是这样的:
text复制project/
├── miniprogram/ # 小程序前端代码
│ ├── pages/ # 页面目录
│ │ ├── index/ # 首页(套餐列表)
│ │ ├── detail/ # 套餐详情
│ │ ├── book/ # 预约页
│ │ ├── order/ # 我的预约
│ │ ├── profile/ # 个人中心
│ │ └── admin/ # 管理员页面
│ ├── components/ # 自定义组件
│ ├── images/ # 静态图片资源
│ ├── app.js # 全局入口逻辑
│ ├── app.json # 全局配置(页面路由、窗口样式)
│ └── app.wxss # 全局样式
├── cloudfunctions/ # 云函数目录
│ ├── login/ # 登录云函数
│ ├── getPackages/ # 获取套餐列表
│ ├── createAppointment # 创建预约
│ ├── getMyAppointments # 查询我的预约
│ └── ... # 其他云函数
└── project.config.json # 项目配置文件
看懂这个结构后,你就能大致判断出这套源码的完成度:前端页面全不全、云函数覆盖了哪些接口、有没有后台管理界面。很多“全套源码”项目其实只有前端页面和几个基础云函数,管理端功能可能是缺失的,这时候需要你自己根据文档补上。
app.json 是全局配置,里面记录了所有页面的路由。新增页面时,必须在这里注册路径,否则跳转会报“页面不存在”。project.config.json 里则配置了 AppID 和云函数目录等参数,导入项目后如果发现云函数无法识别,检查这个文件里的 cloudfunctionRoot 配置是否正确。
3.3 云开发环境配置与云函数部署:让后端真正跑起来
环境准备完成后,接下来的核心操作是:开通云开发环境、创建数据库集合、部署云函数。
在开发者工具里点击“云开发”按钮,按提示开通。开通后会让你创建环境,环境名可以随便起,比如“health-check-dev”。环境创建需要几秒钟,创建完成后,左侧会显示一个环境ID,这个ID后面很多地方要用到。如果你在多个环境之间切换,一定要确认当前使用的是哪个,很多奇怪的“查不到数据”问题都是因为环境选错了。
创建数据库集合的步骤是:打开云开发控制台 -> 数据库 -> 点击“+”按钮,分别创建 users、packages、appointments 三个集合。这里有个关键操作:在 packages 集合里,最好手动插入一条测试套餐数据,否则前端页面会一直空白。插入的数据格式要和你代码里读取的字段一致,比如:
json复制{
"name": "大学生基础体检套餐",
"price": 199,
"items": ["身高体重", "内科", "血常规", "肝功能", "心电图"],
"description": "适合学生群体的基础体检项目",
"capacity": 50,
"available": true
}
然后部署云函数。在开发者工具左侧的文件树里,右键 cloudfunctions 下的每个云函数文件夹,选择“上传并部署:云端安装依赖”。这里有个很常见的错误:右键之后只选择“上传所有文件”,没有勾选“云端安装依赖”,结果云函数里用到 npm 包(比如wx-server-sdk)时直接报找不到模块。所以一定要选“云端安装依赖”选项。
部署完成后,建议在云开发控制台的“云函数”标签页里,点击每个函数名进入日志,看一下调用是否报错。如果函数返回状态码 200,说明部署成功。如果返回 404 等错误,检查函数名是否和前端调用时传入的名称一致,这个名称只要差一个字母,前端就会报“FunctionName parameter could not be found”。
3.4 数据库权限设置:这步不做,数据永远查不到
云数据库的权限设置是新手翻车最集中的地方。云开发控制台里,每个集合都有独立的权限设置,默认情况下通常是“仅创建者可读写”,这对 appointments 集合来说没问题,但对 packages 集合来说就有大问题:未登录用户(或还没写入过记录的创建者)在首页读取套餐列表时,会因为权限不足而读取失败,页面一直转圈。
合理的权限方案是:packages 集合设置为“所有用户可读,仅创建者可写”,因为套餐内容是公共数据,所有人打开首页都应该看到;appointments 集合设置为“仅创建者可读写”,因为预约记录属于用户隐私,每个用户只能看自己的;users 集合也设置为“仅创建者可读写”。如果管理员要查看所有预约记录,不要直接依赖前端权限,而是通过云函数去读取,云函数端管理端有更高权限,可以绕过单条记录的限制。
4. 远程调试与问题排查:现场实录
4.1 微信开发者工具的调试流程:从模拟器到真机
项目跑通之后,你一定会遇到各种奇奇怪怪的问题。这时候就需要系统的调试方法了。微信开发者工具自带三套调试方案:模拟器、真机调试、预览。
模拟器是开发阶段最常用的。它能模拟大部分微信环境,但它不是万能的,比如地理位置、扫码、蓝牙这些能力在模拟器上表现不真实,需要到真机上测试。另外,模拟器里的网络环境、系统版本和你手机差异很大,有些在模拟器上正常的布局,到了手机上可能直接错位。
真机调试是解决这类问题的关键手段。操作方法是:开发者工具顶部工具栏找到“真机调试”按钮,点击后会生成一个二维码,用你的微信扫码,手机上就会打开一个小程序调试版。这时开发者工具里会出现一个“调试器”面板,手机上所有 console.log 的日志、网络请求、页面报错都会实时同步到这个面板里。我强烈建议你在这个模式下跑一遍完整的预约流程,因为模拟器里永远不会暴露真实手机的网络延迟和渲染问题。
还有一个容易被忽略的点:在真机上打开小程序后,如果右上角胶囊按钮附近出现一个绿色的“调试”按钮,说明当前是调试模式。你可以点击它打开 vConsole 面板,直接在手机上查看 console 日志。这对于拍视频、录演示素材来说特别方便,因为评委老师能看到手机屏幕上的运行情况,而你又可以在 vConsole 里展示日志,证明数据交互是真实的。
4.2 常见问题速查表:直接照着排查
我把做这个项目时常见的坑整理成了一张速查表,建议收藏,遇到问题直接对着查。
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
| 首页套餐列表一直加载中转圈 | packages集合权限设置成了仅创建者可读,或环境ID选错 | 将权限改为“所有用户可读”,检查云环境ID |
| 点击登录报“获取登录后的微信用户失败” | AppID未配置、隐私协议未提交、基础库版本过低 | 检查AppID,在公众平台提交用户隐私保护指引 |
| 云函数调用报 FunctionName not found | 云函数未部署或名称拼写错误 | 重新部署云函数,核对前端调用时的函数名 |
| 数据写入成功但页面不显示 | 集合权限、前端查询条件写反或环境不一致 | 检查集合权限,在控制台手动查看集合是否有数据 |
| 真机日期选择器显示NaN或日期错乱 | iOS系统无法解析 “YYYY-MM-DD” 格式的日期字符串 | 把字符串中的 “-” 替换成 “/” 后再 new Date() |
| 预约按钮点击两次生成两条数据 | 没做防重复提交 | 提交后立即将按钮设为 disabled 和 loading 状态 |
| 管理员页面看不到所有预约记录 | 前端直接读取集合,受权限限制 | 改为通过云函数查询,并在云函数中管理端校验权限 |
| 云函数执行超时 | 函数默认超时时间为3秒,可能查询量较大 | 在云函数配置里将超时时间改为10秒或更长 |
这中间有两个问题我想展开说。第一个是“new Date(‘YYYY-MM-DD’) 在 iOS 上返回 NaN”。这个坑特别隐蔽,因为你在开发者工具的模拟器里怎么测都是好的,一拿到iPhone上就崩。原因是 iOS 的 JavaScript 引擎不支持 “YYYY-MM-DD” 这种带横线的日期格式,只认 “YYYY/MM/DD”。最简单的解决方案是在转换前先做一次 replace:dateStr.replace(/-/g, ‘/’)。这个问题如果你能主动写进文档的“系统测试与问题记录”章节,答辩效果会很好,因为老师看到的是你真的在真机上测试过,而不是只跑通了模拟器。
第二个问题是关于“取消预约”后的状态同步。很多人做取消预约时,只是简单地把数据库里的那条记录删掉。这不是最优做法,因为如果你删掉了数据,管理员端的历史统计就丢了,没办法知道你曾经预约过又取消了。更合理的设计是增加一个 status 字段,通过“待确认、已确认、已完成、已取消”四种状态来流转,而不是物理删除。这样管理员侧就能看到完整的预约生命周期,也方便做数据统计。
4.3 我踩过的几个坑以及排查思路
写到这里,再分享几个我在实际项目中踩过的坑,虽然都不是大问题,但排查起来确实费了不少时间。
第一个坑是云函数环境变量。如果你在云函数里直接写死了一个环境ID,比如 cloud.init({ env: ‘xxx’ }),后来你在开发者工具里新建了一个环境,环境ID变了,但云函数里的代码没改,就会出现“数据库读取成功但数据为空”的现象。排查方式是在云函数里加一行 console.log(process.env.TCB_ENV) 打印当前环境,或者在云函数里不做任何指定,直接让云开发自动路由到调用者当前的环境。
第二个坑是本地存储和服务器数据不一致。很多同学喜欢把用户信息存在 wx.setStorageSync 里,这个用法本身没问题,但要注意:本地缓存不会自动同步,用户在小程序里改了头像昵称后,页面显示的可能还是旧缓存。我的习惯是:业务数据一律从云数据库实时获取,本地缓存只存一些非关键的UI状态,比如某个页面的滚动位置。
第三个坑是关于云函数返回值的序列化。云函数里 return 的对象,到最后会被JSON序列化后再传给前端。如果你在云函数里返回了 Date 对象,前端拿到的是一个字符串,不是Date对象,直接调用 .getTime() 会报错。所以,建议在云函数端就把数据格式化好,日期字段统一转成时间戳或者 “YYYY-MM-DD” 字符串,前端拿到就直接用。
5. 文档、答辩与后续扩展:这套源码怎么用才值
5.1 配套文档应该写什么:从需求分析到测试报告
拿到全套源码后,很多人只关心代码能不能跑起来,文档放一边不管。这是很亏的,因为毕设成绩的评估里,文档占的比重往往不低于代码。一套完整的毕设文档,至少应该包含以下六部分:
第一部分是选题背景与研究意义。这一部分不用写太长,把体检预约的现实痛点、微信小程序的优势、选择云开发的原因写清楚就行。重点是用词要专业,比如“传统预约模式存在效率低、信息不透明、资源分配不均等问题”。
第二部分是需求分析。包括功能性需求和非功能性需求。功能性需求就是把用户端和管理员端的每个功能点列出来,用表格或用例图描述清楚。非功能性需求可以从系统性能(响应时间)、安全性(用户数据隔离)、易用性(简洁操作流程)三个维度来谈。
第三部分是系统设计。包含总体架构设计、功能模块设计、数据库设计。总体架构建议画一个层次图,前端小程序 -> 云函数 -> 云数据库三层结构。数据库设计要列出每一张表的字段名、类型、说明,这是整个文档里最硬核的部分,也是老师最可能仔细看的部分。
第四部分是系统实现。针对几个核心功能模块,贴出关键代码片段,并做文字说明。代码不需要全部贴,但像云函数创建预约的完整逻辑、前端防重复提交的处理、日期格式兼容的处理,这些是必贴的。
第五部分是系统测试。包括测试环境、测试用例、测试结果。测试用例最好用表格列出:测试模块、操作步骤、预期结果、实际结果、是否通过。哪怕你只测了简单的页面跳转和数据增删改查,也要认真填好这个表格。
第六部分是总结与展望。总结就写这个系统完成了哪些功能、有哪些不足,展望可以写未来如何加入在线支付、短信提醒等功能。
5.2 答辩时老师经常追问的五个问题
答辩环节是整套源码和文档之外,最需要提前准备的部分。根据我这些年看到的答辩现场,老师针对这类系统最常问的五个问题如下。
第一个:为什么选择云开发,不用传统后端?这个问题的标准答法要突出两点:降低开发成本、微信生态无缝集成。但记得补一句传统方案和云开发各自的适用场景,显得你有过思考。
第二个:用户的openid是怎么获取的?你是怎么保证用户只能看到自己的预约记录?这个问题考察的是你对身份认证和数据权限的理解。答法:在云函数里通过 cloud.getWXContext() 获取 openid,前端提交预约时会自动带上 _openid,集合权限设置为仅创建者可读写,因此每个用户只能访问自己的数据。
第三个:如果同一时间很多人同时预约最后一个名额,怎么解决超约?你要能说出:简单方案是先查后写,严谨方案是用数据库事务。答辩时如果能主动提出用事务解决,会加分。
第四个:管理员是怎么识别出来的?这里要注意,系统里必须有一个管理员权限的设计。常规方案是在用户表里增加一个 role 字段,比如 role: ‘admin’,管理员云函数里先查用户表判断身份再执行操作。
第五个:用户取消预约后,数据库里是删除记录还是修改状态?正确答案是修改状态。理由前面已经说过了:保留完整的预约生命周期数据,方便统计和分析。
5.3 还能怎么扩展:订阅消息、支付与可视化报表
最后聊聊扩展方向。虽然毕设演示时不一定全做完,但文档的“展望”部分如果有这些,会显得你有产品思维。
第一个扩展是微信订阅消息。体检预约这个场景天然适合“预约成功通知”和“预约提醒”。小程序可以通过 wx.requestSubscribeMessage 让用户授权接收订阅消息,然后在云函数里调用 subscribeMessage.send 下发通知。做这个需要在小程序后台申请订阅消息模板,但对平时做毕设的同学来说,值得一试。
第二个扩展是在线支付。体检套餐往往涉及费用,接入微信支付需要一个商户号,个人主体的小程序申请商户号比较麻烦,所以扩展性一般。但如果你能画出支付流程时序图,并在文档里说明微信支付接口的调用流程,也能体现你对商业闭环的理解。
第三个扩展是管理后台的数据可视化。现在云开发控制台本身就能看到集合的数据,但不够直观。你可以用云函数定时统计每天的预约数量,生成一个简单的图表页面。比如写一个静态的预约数据统计页,展示最近7天每天预约人数,用简单的柱状图实现即可。这个扩展对前端能力要求不高,却能让整个系统看起来完成度更高。
我在实际带学生做这个项目的过程中最深的体会是,这个题目的难度正好卡在“需要你真正动手,但又不至于做不出来”的分界线上。前端页面再好看,没有云函数和数据库支撑也只是空壳;后端逻辑写得再严谨,前端交互体验差也一样伤整体效果。所以拿到源码后,别急着改代码,先把登录链路、预约链路、权限控制链路这三条主线路走通,再谈优化和扩展。等你把这三条链路都跑顺了,这个毕设基本上就稳了。
