我每年都能看到不少学生选“Spring Boot + 微信小程序”做互联网诊疗方向的毕设,这个课题确实很典型:后端有Spring Boot撑腰,前端有小程序快速出界面,业务上又有医疗信息化这个足够“有分量”的落脚点,不管是论文、答辩还是演示效果,都容易做出东西。但说实话,正因为做的人多,同质化特别严重,很多人交上去的系统就是“医生列表 + 聊天窗口 + 挂号表单”三板斧,除了能截几张图给老师看,几乎没有真正的诊疗业务逻辑。
这篇文章我把这套课题的完整拆解思路、核心实现细节和踩坑记录整理出来,覆盖Spring Boot后端、微信小程序前端、数据库设计、登录鉴权、问诊流程、部署上线等关键环节,适合准备做毕设的学生,也想自己从零搭一套在线问诊系统的开发者。里面所有方案都按毕业设计的成本和周期来设计,不堆无用的复杂技术,但该有的业务闭环一个都不少。
1. 项目整体设计与技术选型
先聊一个很多学生忽略的问题:为什么在2025年做这种医疗类线上系统,还是推荐Spring Boot + 微信小程序这个组合?核心原因就三个:上手成本低、演示效果好、答辩有话说。Spring Boot把Java后端开发的门槛降到了很低的程度,内置Tomcat、自动装配、Starter机制,意味着你不用花大量时间折腾配置,把精力放在业务逻辑上;小程序端则天然解决了“用户获取”的问题——扫码即用、无需下载App,对毕设场景来说,老师体验你的系统时直接用微信扫码,比在电脑上装客户端、配环境变量要友好得多。
但是,“医疗 + 互联网”这个组合有个特殊性:它不只是一堆增删改查,还涉及医患之间的双向交互、问诊状态流转、处方和病历的数据关联,甚至要考虑合规边界。毕设环境下不需要真正对接医院信息系统,但设计和实现时要体现“诊疗”的语义——比如问诊单不是简单的一个聊天记录,而应该有状态、有主诉、有病史、有处理建议,这些业务词一出来,系统档次立刻就上去了。
1.1 为什么是Spring Boot而不是其他框架
很多学生会问,为什么不选Python的Flask或Django,甚至Node.js?我的看法是,只要你的项目叫“计算机毕业设计”,Spring Boot在校招和答辩场景里始终是加分项。原因一是国内企业级Java生态实在太成熟了,Spring Boot + MyBatis Plus + MySQL这套组合在中小型项目中几乎成了事实标准,老师听到这个技术栈会觉得你“用了业界主流方案”;二是Java的强类型特性在处理医疗数据这种结构性强、字段规则明确的业务时,比脚本语言更不容易写乱。
Spring Boot本身的自动装配机制对毕设非常友好。你引入 spring-boot-starter-web,内嵌Tomcat就起来了;引入 spring-boot-starter-validation,参数校验注解直接可用;引入 spring-boot-starter-data-redis,缓存和分布式会话也有了。这套“按需引入依赖”的方式,让项目结构天然清晰,每一层干什么一目了然,写起来也舒服。
提示:如果条件允许,Spring Boot版本选择3.x,但要注意JDK版本必须是17及以上。如果你电脑上还是JDK 8,那就老老实实用Spring Boot 2.7.x系列,千万别硬配高版本导致启动报一堆错,后面我会专门讲这个坑。
1.2 小程序端为什么比H5端更合适
医疗类业务有一个特点:用户需要的是“即用即走”的体验,患者可能只是临时想咨询一个症状,不想安装一个几十MB的App,也不愿意在浏览器里收藏一个网址。微信小程序天然适合这种低频、刚需、轻交互的场景。另外,小程序提供的原生能力对医疗业务很有用——微信登录获取用户身份、订阅消息做问诊提醒、支付能力做在线缴费,这些能力如果自己做App,身份认证、消息推送、支付牌照每一项都能让你在毕设周期内崩溃。
还有一个容易被忽略的原因:微信开发者工具自带手机预览,你在电脑上写代码,点一下就能在真机上跑,演示的时候特别方便。而做H5的话,你还需要处理浏览器兼容、手机调试、域名HTTPS等问题,工作量翻倍,效果还不一定好。
1.3 诊疗业务的特殊性与设计约束
互联网诊疗不是普通的电商或社交系统,它有几个业务上的特殊性需要在设计阶段就考虑清楚:第一,问诊是“过程态”而不是“结果态”,一条问诊记录从用户发起、医生接入、交流沟通到处方建议,每一步都有关联数据要保存;第二,医患之间是异步交互,医生不可能实时在线回复,所以系统需要有明确的“待处理”“进行中”“已完成”状态;第三,数据敏感度高,出于演示目的可以不追求等保合规,但代码里至少要体现安全意识,比如密码不存明文、会话使用Token等。
这些约束反映到系统设计上,就是模式的选择:“C/S + B/S混合”。微信小程序是C端(患者端),医生端和管理员端建议做网页版(B端)——因为医生操作病历、填写建议时用电脑更高效,这也是“互联网诊疗”系统真实落地的形态。很多毕设只做了小程序一个端,导致医生和患者用同一个界面,演示时非常尴尬。我在方案里加了Spring Boot + Vue的Web管理后台,数据共用一套接口,这个设计在答辩时很容易成为亮点。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 功能模块拆解与数据库设计
功能设计上,我建议不要追求“大而全”,而是抓住诊疗闭环:患者注册登录、浏览医生、发起问诊、填写病情描述、与医生在线沟通、查看医生建议、对问诊进行评价;医生登录后台、处理问诊、查看患者历史病历、回复建议;管理员管理医生信息、审核问诊记录、统计数据。这个流程走通,系统就是完整的。
2.1 三类角色的功能边界
患者端(微信小程序)核心功能包括:微信一键登录、实名信息维护、医生列表与详情、按科室筛选医生、发起图文问诊、填写病情描述(包含症状、持续时间、既往病史、上传图片)、查看问诊会话列表、查看医生回复与建议、完成评价。
医生端(Web管理后台)核心功能包括:账号密码登录、查看分配给自己的问诊列表、查看患者信息和历史问诊记录、回复患者消息、填写诊断建议、关闭问诊。
管理员端(Web管理后台)核心功能包括:医生账号管理(增删改查、审核资质)、科室管理、问诊记录总览、数据统计(问诊量、科室分布、患者增长)。
这里要提醒一下,患者端和管理员端的数据权限要严格区分:患者只能看到自己的问诊记录,医生只能看到分配给自己的患者,管理员才能看到全部。这个权限控制用Spring Boot拦截器或AOP实现,是答辩时最容易展开讲的技术点。
2.2 核心数据表设计思路
数据库我设计为8张核心表,全部使用MySQL的InnoDB引擎,字符集utf8mb4(必须,否则表情符号和特殊字符会乱码)。不要图省事把所有字段塞到一张表里,清晰的表结构不仅方便写代码,也方便论文里画E-R图。
| 表名 | 说明 | 核心字段 |
|---|---|---|
| user | 患者用户表 | openid、nickname、avatar、phone、real_name、id_card |
| doctor | 医生表 | name、title、department_id、avatar、intro、status |
| department | 科室表 | name、description |
| consultation | 问诊记录表 | user_id、doctor_id、status、chief_complaint、present_illness、past_history、diagnosis、suggestion |
| message | 会话消息表 | consultation_id、sender_type、content、image_url、create_time |
| appointment | 预约挂号表 | user_id、doctor_id、appointment_date、time_slot、status |
| evaluate | 评价表 | consultation_id、user_id、score、content |
| admin | 管理员表 | username、password(BCrypt加密) |
有两个设计细节值得展开。第一个是 consultation 表的状态字段,我建议用整数 enum(0待接诊、1问诊中、2已完成、3已关闭),而不是直接用字符串,因为整数在索引和状态判断上性能更好,而且代码里用常量类集中管理,避免魔法值散落各处。第二个是 message 表的 sender_type 字段,必须区分是患者发的还是医生发的,这样小程序端和Web端才能正确展示气泡方向。
code复制CREATE TABLE consultation (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL COMMENT '患者ID',
doctor_id BIGINT NOT NULL COMMENT '医生ID',
status TINYINT DEFAULT 0 COMMENT '0待接诊 1问诊中 2已完成 3已关闭',
chief_complaint VARCHAR(500) COMMENT '主诉',
present_illness TEXT COMMENT '现病史',
past_history TEXT COMMENT '既往史',
diagnosis VARCHAR(500) COMMENT '诊断建议',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
KEY idx_user_id (user_id),
KEY idx_doctor_id (doctor_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='问诊记录表';
这个建表语句里还加了一个小细节:update_time 字段设置了 ON UPDATE CURRENT_TIMESTAMP,这样记录每次更新状态时时间会自动刷新,查询“最近活跃问诊”时非常有用,而且代码里不用手动处理,省心。
2.3 接口设计规范
后端接口统一使用 /api 前缀,所有返回结果统一封装为 Result<T> 对象,结构为 code + message + data,前端拿到之后用同一个函数处理成功和错误,代码干净很多。比如:
json复制{
"code": 0,
"message": "success",
"data": { }
}
这里有个实操心得:code = 0 表示成功,非0表示失败,不要用HTTP状态码直接做业务判断。因为小程序端网络请求失败和业务逻辑失败是两个不同层面的东西,如果混在一起,前端错误提示会非常难写。你要是看到H5端 200 里面还包了一层 code,这就是行业标准做法,照抄就行。
3. 核心功能实现与代码级拆解
这一部分重点拆两个最核心的流程:微信登录与鉴权链路、在线问诊与预约流程。这两个流程是系统的骨架,也是答辩时老师最可能深挖的地方。
3.1 微信登录与鉴权链路
登录逻辑要理清楚微信小程序的登录流程:小程序端调用 wx.login() 拿到一个临时凭证 code,然后把这个code发给后端;后端拿到code后,调用微信的 jscode2session 接口,传入小程序的 appid 和 secret,换取用户的 openid 和 session_key;openid是用户在微信体系下的唯一标识,用它作为业务账号。
这里的关键点在于:openid一旦通过code换回来了,后端要拿着它去查用户表,如果不存在就自动注册一个新用户,而不是强制用户先填一堆资料才能登录。很多毕设把登录做成“先登录再注册”,体验很差,现实中用户打开小程序应该是无感登录的。实现逻辑参考:
java复制@PostMapping("/api/auth/login")
public Result<LoginVO> login(@RequestBody LoginDTO dto) {
// 使用dto.getCode()去微信接口换取openid
String url = "https://api.weixin.qq.com/sns/jscode2session?appid="
+ appid + "&secret=" + secret + "&js_code=" + dto.getCode() + "&grant_type=authorization_code";
// 发起HttpGet请求拿到openid...
User user = userMapper.selectByOpenid(openid);
if (user == null) {
user = new User();
user.setOpenid(openid);
// 匿名用户先给一个默认昵称
user.setNickname("微信用户" + openid.substring(openid.length() - 6));
userMapper.insert(user);
}
// 生成JWT令牌返回给前端
String token = JwtUtil.createToken(user.getId(), "user");
return Result.success(new LoginVO(token, user));
}
拿到openid之后的鉴权用JWT。用户登录成功后,后端签发一个有效期7天的JWT令牌,小程序端每次请求都把它放在请求头 Authorization 里,后端通过拦截器解析令牌,从中取出用户ID,放到ThreadLocal里供业务代码使用。
注意:换openid的请求必须由后端发起,绝对不能在小程序端直接用appid和secret调换接口——secret一旦被前端拿到,任何人都可以冒充你的小程序。这也是微信官方文档明确禁止的做法,答辩时如果被问“为什么不在前端调”,你得能答上来。
这里有一个非常容易踩的坑:真机和模拟器登录后获取不到用户信息,报错 wx1cb4398e1413dce7。这个错误其实不是你的代码错了,而是“未登录”或“code无效”的提示。常见原因是后端去请求微信接口时,网络不通或appid/secret配置错误。排查思路:先用微信开发者工具的清缓存功能清掉所有缓存,确保后端日志里能打出来 jscode2session 接口的返回值,如果返回 errcode: 40029,说明code无效——很可能是同一个code被用了两次;如果是 40163,说明code已经过期,需要重新获取。这块逻辑写在拦截器里,不需要写很多代码,但一定要加,否则未登录用户也能访问医生列表和问诊接口,答辩时会被反问安全问题。
3.2 问诊与预约的核心状态机
在线问诊不是简单的聊天,它是一个有状态流转的业务。我用一张状态机来管理(不用图形,用文字描述):用户发起问诊 → 状态变为“待接诊”(0),此时医生端列表里能看到新问诊;医生点击“接诊” → 状态变为“问诊中”(1),患者和医生可以互发消息;医生填写诊断建议并点击“结束问诊” → 状态变为“已完成”(2)。过程中患者也可以主动“取消问诊” → 状态变为“已关闭”(3)。
这个状态机的好处是逻辑清晰,而且每个状态改变都对应一个具体的后端接口,接口内部要先校验当前状态是否允许目标状态跳转。比如问诊已经完成了,就不能再发消息,也不能再“接诊”。这个业务规则用代码实现就是:
java复制@PutMapping("/api/consultation/{id}/accept")
public Result<Void> accept(@PathVariable Long id) {
Consultation consultation = consultationMapper.selectById(id);
if (consultation == null) {
return Result.error("问诊记录不存在");
}
if (consultation.getStatus() != 0) {
return Result.error("该问诊已被处理,无法重复接诊");
}
// 校验当前操作者是否为该问诊对应的医生
// ...
consultation.setStatus(1);
consultationMapper.updateById(consultation);
return Result.success();
}
预约挂号模块的流程稍微复杂一点,涉及排班和号源。为了控制毕设体量,我建议简化处理:医生维护每周的出诊时段,每个时段有固定的号源数;用户选择日期和时段后,系统判断剩余号源是否大于0,如果大于0就创建订单并扣除号源,否则提示“已约满”。并发不需要做得很重,但至少要给号源表加一个 version 字段做乐观锁:
sql复制UPDATE schedule SET remaining = remaining - 1
WHERE id = #{scheduleId} AND remaining > 0;
用这条SQL做原子扣减,天然避免了两个人同时约到最后一个号的问题。这是最经典的“乐观锁 + 数据库原子操作”方案,写进论文里是一个很好的技术亮点。微信小程序端那边可以用表单收集患者的姓名、手机号、身份证、病情描述,加上一张图片上传(通过 wx.chooseMedia 选择图片后走后端上传接口),提交后进入问诊列表。小程序端代码大概长这样:
javascript复制wx.request({
url: `${baseUrl}/api/consultation/create`,
method: 'POST',
header: {
'Authorization': `Bearer ${token}`
},
data: {
doctorId: this.data.doctorId,
chiefComplaint: this.data.chiefComplaint,
presentIllness: this.data.presentIllness,
imageUrls: this.data.imageUrls
},
success: (res) => {
if (res.data.code === 0) {
wx.showToast({ title: '发起成功', icon: 'success' });
wx.navigateBack();
} else {
wx.showToast({ title: res.data.message, icon: 'none' });
}
}
});
这里要补充一个细节:微信小程序端所有请求都会带上 header 里的Authorization,这是为了通过后端的JWT拦截器。有些学生做这个项目时把token存在全局变量里,小程序一冷启动就丢了,这是不对的。正确做法是把token存到 wx.setStorageSync('token', token),每次请求前从Storage中读取,这样即使用户杀了小程序再打开,登录态依然能恢复。
3.3 消息推送的取舍
原本问诊模块里“医生回复后通知患者”的功能是很加分的,但微信订阅消息需要小程序后台申请模板,且用户必须订阅后才能推送。另外,订阅消息是一次性订阅,用户点了“允许”只能收到一条推送,这个限制导致如果你想让整个问诊过程都自动通知用户,需要在前端引导用户每次发起问诊时点击订阅,否则推送不了。毕设场景下,我给学生的方法是:问诊发生状态变化时,小程序端在 onShow 生命周期里重新拉取列表数据,用轮询代替推送,成本低、稳定、效果也不差。如果你确实想展示订阅消息的能力,可以在用户提交问诊时弹出一个订阅授权按钮,代码逻辑不复杂,但演示时记得用真机,因为模拟器不支持订阅消息。
4. 高频问题排查与踩坑实录
这个话题我在带学生时几乎每次都要重复讲,因为问题高度重合,列出来给大家当避坑指南。
4.1 Spring Boot版本太高引发的连锁反应
如果你用的是Spring Boot 3.2.x,却用JDK 8去运行,启动就会直接失败,提示 UnsupportedClassVersionError。这个报错的本质是Spring Boot 3.x编译时要求JDK 17+,JDK 8跑不了。很多学生装环境时装了最新版,编译期没爆错,一运行就懵了。解决办法有两个:一是把JDK升级到17,pom.xml 里配置 <java.version>17</java.version>;二是把Spring Boot降级到2.7.x,同样可以跑,适合电脑上已经有大量JDK 8项目的情况。
另外,Spring Boot 3.x还有一个容易踩的坑:javax.servlet 包改成了 jakarta.servlet。如果你在网上复制了一段Spring Boot 2的代码,导入了 javax.servlet.http.HttpServletRequest,在3.x下编译会直接报“包不存在”。遇到这种问题,记住一个原则:Spring Boot 2用的是 javax.*,Spring Boot 3用的是 jakarta.*,不要混用。
4.2 小程序请求后端连接失败,真机 net::ERR_CONNECTION_RESET
这个问题高居小程序开发疑难榜前三。根本原因几乎都指向同一个:微信小程序要求所有请求必须是HTTPS,而且域名必须在小程序后台配置为合法域名。在开发阶段,你可以在开发者工具里勾选“不校验合法域名、web-view(业务域名)、TLS版本以及HTTPS证书”,这样本地调试用 http://localhost:8080 就行。但真机预览时,手机会用微信内置浏览器发起请求,此时没有开调试模式(或者之前的设置被重置),就会报 net::ERR_CONNECTION_RESET。
解决办法分两种:如果只是演示,可以在真机上打开“开发调试”模式,在预览弹窗里勾选“开启调试”;如果想让系统上线,必须做两件事:一是后端部署到公网服务器,并配置HTTPS证书(用Nginx反代非常方便),二是把HTTPS域名和文件校验配置到小程序后台的“服务器域名”里。这里提醒一下,如果后端配置了HTTPS但证书不是正规CA机构签发的,小程序依然会拦截,免费的Let's Encrypt证书也可以,只要是受信任的CA就行。
4.3 小程序ID和AppID设置不一致
有学生在用HBuilderX或者微信开发者工具导入项目时,明明在项目里改了AppID,但模拟器里预览时还是显示原来的小程序ID。这个问题的原因一般是配置文件里有多处AppID设置,只改了一处。微信开发者工具的 project.config.json 和 appid 字段如果和 app.json 冲突,工具会优先用前者。在HBuilderX里开发uni-app运行时,还要检查 manifest.json 里的微信小程序配置。
解决思路就一句话:全局搜索 appid,找到所有出现的地方,统一改掉,然后重新编译。另外,如果你的小程序账号是个人主体,很多API权限没有(比如支付),不要在毕设里做“微信支付”功能,做个模拟支付流程(前端弹窗提示)就足够了,不然审核和上线阶段都会受阻。
4.4 配置了HTTPS但图片上传还是失败
上传图片报错是另一个高频问题。小程序端上传图片用的 wx.uploadFile 走的也是合法域名校验,如果你只把接口域名加了白名单,但文件服务器用的是另一个域名,那上传依然会被拦截。更隐蔽的问题是,后端如果上传文件的目录没有写权限,Spring Boot会抛 FileNotFoundException,报错却提示“请求失败”。
建议的做法是:后端写一个统一的上传接口,把文件保存到服务器本地指定目录,并开启静态资源映射(Spring Boot 2.x里用 WebMvcConfigurer 的 addResourceHandlers 方法即可,Spring Boot 3.x也一样),把上传目录映射成 /files/** 的URL,然后在Nginx里对这个路径单独设置代理和HTTPS证书。这样静态图片域名和接口域名保持一致,小程序端不用额外配置,省很多事。
java复制@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
String uploadPath = "file:" + System.getProperty("user.dir") + "/upload/";
registry.addResourceHandler("/files/**").addResourceLocations(uploadPath);
}
}
这里有个实际操作中的细节:System.getProperty("user.dir") 返回的是项目启动时的目录。如果你用IDE启动,就是项目根目录;如果打成Jar包用 java -jar 启动,就是执行命令时所在的目录。如果目录不对,明明上传成功了,前端访问时却404。最稳的做法是在 application.yml 里配置一个绝对路径,比如 D:/upload/,然后在上传接口里读取这个配置项作为存储路径。
4.5 “小程序打开提示请用小程序打开”怎么破
如果你的H5页面在小程序WebView里打开,或者用户通过分享卡片进入,有时会看到提示“请在微信客户端打开链接”——这个问题偶尔出现在迁移域名或转发场景中。微信对这种行为有严格限制,解决方法是检查微信公众平台的“业务域名”配置是否填写了正确的域名,且该域名下必须放置指定的校验文件 xxxxxx.txt。Spring Boot项目在 src/main/resources/static/ 下直接放校验文件,重启后就能通过验证。注意校验文件在一个域名下只能绑定一个小程序,如果域名已经被其他小程序占用,你会看到“文件校验失败”,那就只能换个域名。
4.6 单元测试和后续维护建议
答辩时很多老师会问“有没有写过单元测试”,如果你说没写过,会显得体系性不够。Spring Boot的 spring-boot-starter-test 内置了JUnit 5和AssertJ,写测试的成本比想象中低很多。建议至少写三个用例:一个用户登录接口的测试(验证返回token)、一个问诊状态流转的测试(验证非法状态变更被拦截)、一个号源扣减的测试(验证并发情况下不会超卖)。测试类用 @SpringBootTest + MockMvc构造,测完输出盖在论文的测试章节里,整篇论文的厚度和质量都上来了。
java复制@SpringBootTest
@AutoConfigureMockMvc
public class ConsultationApiTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testCreateConsultation() throws Exception {
mockMvc.perform(post("/api/consultation/create")
.header("Authorization", "Bearer " + getToken())
.contentType(MediaType.APPLICATION_JSON)
.content("{\"doctorId\":1,\"chiefComplaint\":\"头痛\"}"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.code").value(0));
}
}
做完这些之后,你一定用 maven clean package 打包过项目——注意测试代码不要放在 src/main/java 下,否则打包时会执行不到测试,但会把测试类打进去。
5. 从开发到答辩的落地经验
系统本身写完,还差最后一步:部署演示。毕设评审现场的高频事故就是“老师点一下按钮,系统崩了”。避免这个问题,我有几个非常具体的建议。
第一,准备一台阿里云/腾讯云的2核4G轻量服务器,把MySQL、Redis和Spring Boot的Jar包部署上去,小程序端连接公网HTTPS接口。这样演示的时候不需要依赖你电脑的电量和网络。对毕设这个并发规模,2核4G完全够用,一个月几十块钱的服务器费用,省去现场80%的幺蛾子。
第二,数据库里预置一批模拟数据:8个医生分布在4个科室,每个医生配一个排班表,用户表里放两三个测试账号,问诊记录至少造10条不同状态的(待接诊、问诊中、已完成),这样老师点开任何页面都有内容看,而不是面对空白页面。很多学生答辩翻车就翻在“演示的时候数据不够”,白花花的一片列表,老师会立刻怀疑系统的真实性。
第三,做好演示脚本,规划好“先演示什么、后演示什么”。推荐顺序是:患者端登录(展示微信无感登录)→ 浏览医生列表 → 发起图文问诊(重点展示填写病情描述、上传图片)→ 切到医生端Web后台处理问诊 → 回到患者端查看消息回复和医生建议 → 去管理员后台看统计数据。这条链路走下来,核心功能全覆盖,节奏紧凑,十分钟内能完成,也不容易卡壳。
第四,提前准备几个答辩必问问题的答案,因为“为什么用JWT而不用Session”“登录怎么获取openid”“并发预约怎么处理”“数据库为什么这么设计”几乎是每个评委会追问的,你在项目中必须能回答上来:“JWT是无状态的,适合前后端分离架构和小程序端频繁请求的场景;openid是后端通过code向微信接口换取的,secret不外露;并发用原子更新 + remaining > 0 条件保证不超卖;业务表分离是为了让问诊记录、消息记录、评价记录各司其职,避免一张表膨胀。”这些问题答得流畅,答辩基本就稳了。
最后,关于“互联网诊疗”这个课题的延伸,启动开发之前想清楚它的定位很重要——它不只是“毕设”,也是一个小而完整的产品:上游有用户获取,中游有医患交互,下游有数据沉淀和统计分析。在这个体量下把所有业务闭环做透,再辅以Spring Boot、微信小程序、MySQL这些主流技术栈的扎实运用,无论是对毕设成绩还是后续找工作,这个项目的含金量都不会低。
