☰
智慧医疗挂号App源码实战:Android+服务器端毕设项目避坑指南
2026/9/30 7:26:42 网站建设 项目流程

简介:这份资源是面向高校计算机相关专业毕业设计的完整安卓项目案例,基于AndroidStudio与SQLite数据库开发,包含安卓客户端与服务器端源码及项目文档,适合正在准备毕业设计、需要智慧医疗或健康医疗方向选题的学生参考与二次开发。压缩包共115个文件,约4.87MB,以40个xml布局、14个java业务代码、30张jpg与16张png界面素材为主,另含gradle构建脚本、项目报告docx及说明文档,结构完整、便于导入运行。功能覆盖病人注册登录、流行病学调查表填写、核酸检查预约与记录查询、新冠疫苗预约与记录查询、门诊预约与记录查询,以及医保卡绑定、就诊卡创建管理等模块,基本还原了医院预约挂号的核心业务流程。目前已有503人学习下载,可作为毕业设计选题、课程设计或安卓入门实战的参考模板,帮助读者快速理解原生安卓项目的页面组织、数据存储与业务逻辑实现方式。

1. 从一份能跑通的智慧医疗挂号 App 源码说起

很多同学做毕设时都卡在同一个地方:选题定了“智慧医疗医院预约挂号”,但真到动手,发现 Android 客户端和服务器端要同时写,数据库要设计,接口要联调,最后还要写文档。网上找的源码要么只有客户端没有服务端,要么跑起来一堆红叉,改都不知道从哪改。这份基于 Android Studio 开发的智慧医疗医院预约挂号 App 源码,包含安卓客户端和服务器端两部分,配套项目文档,正好解决“有代码但跑不通、有功能但说不清”的问题。它适合正在做 Android 方向毕设的本科生,也适合想拿一个完整前后端项目练手的开发者。下面我按实际拆包和复现的顺序,把这份资源从环境搭建到接口联调再到避坑,完整走一遍。

2. 环境搭建与工程结构:把 Android Studio 和服务器端跑起来

2.1 开发环境版本选择与 Gradle 配置

拿到源码第一步不是急着点 Run,而是先确认 Android Studio 版本和 Gradle 插件版本能不能对上。这份项目用的是较常见的 Android Studio 4.x 到 2021 版本区间,Gradle 插件版本一般在 4.1.2 到 7.0 之间。如果你本地装的是最新版 Android Studio,直接打开大概率会提示 “Could not determine the dependencies of task ':app:compileDebugJavaWithJavac'”,这就是 Gradle 版本不匹配的典型报错。

常见做法是:先看项目根目录build.gradle里的com.android.tools.build:gradle版本号,然后去 Android Studio 官网查对应关系。比如插件是 4.1.2,就用 Android Studio 4.1.2 以上、4.2 以下;插件是 7.0,就用 Android Studio 2021.1.1 以上。如果不想换 IDE,也可以直接改 Gradle 插件版本,但要注意compileSdkVersion和targetSdkVersion也要跟着调。

// 项目根目录 build.gradle buildscript { repositories { google() mavenCentral() // 老项目可能是 jcenter(),现在建议换成 mavenCentral } dependencies { // 根据你本地 Android Studio 版本调整,不要盲目用最新 classpath 'com.android.tools.build:gradle:4.1.2' } }

这段配置决定了整个工程的构建工具链。google()和mavenCentral()是依赖仓库,老项目如果只写了jcenter(),现在可能拉不到部分包,建议补上mavenCentral()。classpath那行是 Gradle 插件版本,改完记得点 Sync Now,不要直接 Run。

2.2 服务器端数据库导入与接口地址修改

客户端能编译只是第一步,真正让 App 有数据的是服务器端。这份资源的服务器端通常是 Java Web 项目,可能是 Servlet 或 Spring Boot 的简化版,数据库用 MySQL。先找到服务器端目录里的.sql文件,在 MySQL 里建一个库,比如smart_medical,然后导入表结构和初始数据。

# 登录 MySQL 后执行 CREATE DATABASE smart_medical DEFAULT CHARACTER SET utf8mb4; USE smart_medical; SOURCE /path/to/smart_medical.sql;

导入完成后,打开服务器端项目里的数据库配置文件,一般是db.properties或application.yml,把用户名和密码改成你本地的。接着启动服务器,默认端口可能是 8080 或 8081。启动成功后,在浏览器访问http://localhost:8080/看有没有返回,如果 404 但控制台没报错,说明项目路径可能带了项目名,比如http://localhost:8080/medical/。

客户端这边要改接口地址。全局搜BASE_URL或http://,把 IP 换成你电脑的局域网 IP,不要用localhost,因为手机和模拟器访问不到你电脑的 localhost。模拟器用10.0.2.2代替localhost,真机就用电脑的192.168.x.x。

// 客户端网络请求配置,常见于 Retrofit 或 OkHttp 工具类 public class ApiConfig { // 模拟器访问本机用 10.0.2.2,真机用电脑局域网 IP public static final String BASE_URL = "http://10.0.2.2:8080/medical/"; // 如果服务器端有上下文路径,这里要带上,否则 404 }

BASE_URL末尾的斜杠和路径拼接方式有关,Retrofit 里如果接口注解以/开头,会覆盖掉 BASE_URL 的路径部分,导致请求地址不对。改完地址后,先跑登录接口,用浏览器或 Postman 测一下http://10.0.2.2:8080/medical/user/login能不能返回 JSON,再跑 App。

3. 核心功能模块拆解:预约挂号、科室管理与用户体系

3.1 预约挂号流程的客户端实现

预约挂号是这份 App 的主线功能,流程一般是:选科室 → 选医生 → 选日期和时段 → 确认预约 → 生成挂号单。客户端这边通常用 RecyclerView 展示科室列表,点击后带科室 ID 跳转到医生列表,再带医生 ID 和排班 ID 跳到确认页。

// 科室列表点击跳转,携带科室 ID recyclerView.addOnItemTouchListener(new OnItemClickListener() { @Override public void onItemClick(View view, int position) { Department dept = departmentList.get(position); Intent intent = new Intent(MainActivity.this, DoctorListActivity.class); // 科室 ID 是后续查询医生的关键参数 intent.putExtra("department_id", dept.getId()); startActivity(intent); } });

这里的关键参数是department_id,医生列表接口会根据它筛选医生。如果点击后医生列表为空,先检查这个 ID 有没有传对,再检查服务器端 SQL 有没有写where department_id = ?。排班数据一般按日期分组,客户端用日期选择器拿到yyyy-MM-dd格式的字符串,再请求当天可预约的时段。

确认预约时,客户端会发一个 POST 请求,带上用户 ID、医生 ID、排班 ID、就诊人信息。服务器端要先查这个排班还剩几个号,如果为 0 就返回“已约满”,否则插入挂号记录并更新剩余号源。这一步涉及事务,服务器端代码里如果有@Transactional注解,确认它生效了,否则并发下会出现超号。

3.2 服务器端接口设计与数据库表关系

服务器端一般分三层:Controller 接请求,Service 处理业务,Dao 操作数据库。以挂号接口为例,Controller 收到请求后调 Service,Service 先查排班剩余号源,再插挂号单,最后减号源。数据库里至少要有user、department、doctor、schedule、appointment这几张表。

表名关键字段作用
userid, username, password, phone存患者和医生账号
departmentid, name, description科室信息
doctorid, name, department_id, title医生信息,关联科室
scheduleid, doctor_id, date, time_slot, total, remaining排班和号源
appointmentid, user_id, schedule_id, status, create_time挂号记录

schedule表的remaining字段是核心,每次预约成功要减 1,取消预约要加 1。如果服务器端没有做这个字段的更新,就会出现“约满了还能约”的 bug。常见做法是在 Service 层用update schedule set remaining = remaining - 1 where id = ? and remaining > 0,根据返回的影响行数判断是否成功,这样比先查再减更安全。

-- 原子减号源,避免并发超约 UPDATE schedule SET remaining = remaining - 1 WHERE id = #{scheduleId} AND remaining > 0;

这条 SQL 的影响行数如果是 0,说明号源已满,Service 层直接抛异常回滚,不要继续插挂号单。很多同学写的代码是先select remaining,判断大于 0 再update,中间有时间窗口,并发下会出问题。

3.3 用户登录与角色区分

这份 App 通常有患者和医生两种角色,登录后跳不同界面。登录接口返回用户信息时带一个role字段,客户端根据它决定进患者首页还是医生首页。密码一般做 MD5 或 BCrypt 加密,不要明文存库。

// 登录成功后根据角色跳转 if ("patient".equals(user.getRole())) { startActivity(new Intent(LoginActivity.this, PatientHomeActivity.class)); } else if ("doctor".equals(user.getRole())) { startActivity(new Intent(LoginActivity.this, DoctorHomeActivity.class)); } else { Toast.makeText(LoginActivity.this, "角色异常", Toast.LENGTH_SHORT).show(); }

如果登录后一直跳不过去,先看服务器返回的 JSON 里role字段是不是空,再检查客户端解析时字段名有没有写错。有些项目用 Gson 解析,字段名要和 JSON 的 key 完全一致,大小写敏感。

4. 避坑与常见问题排查:从红叉到联调失败的六条血泪经验

4.1 编译报错 Could not determine dependencies

现象:打开项目后 Gradle Sync 失败,提示Could not determine the dependencies of task ':app:compileDebugJavaWithJavac'。原因通常是 Gradle 插件版本和本地 Android Studio 不匹配,或者仓库地址失效。解决:先改根目录build.gradle的插件版本,再检查repositories里有没有jcenter(),有就换成mavenCentral(),然后 File → Invalidate Caches / Restart。

4.2 模拟器启动后 App 不显示或闪退

现象:点 Run 后模拟器里找不到 App 图标,或者打开就闪退。原因可能是AndroidManifest.xml里 Activity 没注册,或者targetSdkVersion太高导致权限没申请。解决:先看 Logcat 的报错,如果是ClassNotFoundException,检查 Activity 是否在 Manifest 里声明;如果是SecurityException,检查有没有动态申请存储或网络权限。

4.3 接口请求返回 404 或连接超时

现象:App 能打开但登录没反应,Logcat 显示HTTP 404或ConnectException。原因通常是BASE_URL写成了localhost,或者服务器端没启动。解决:模拟器用10.0.2.2,真机用电脑局域网 IP,并确认手机和电脑在同一 WiFi 下。服务器端启动后先用浏览器测接口,通了再跑 App。

4.4 数据库中文乱码

现象:科室名、医生名显示成问号或乱码。原因:数据库建库时没指定utf8mb4,或者连接 URL 没加字符集参数。解决:建库用DEFAULT CHARACTER SET utf8mb4,JDBC URL 加?useUnicode=true&characterEncoding=utf8。

4.5 预约后号源没减少

现象:同一个排班可以无限预约。原因:Service 层没有更新remaining字段,或者更新时没有加remaining > 0条件。解决:用原子 UPDATE 语句,根据影响行数判断是否成功,失败就回滚。

4.6 项目文档和代码对不上

现象:文档里写的接口路径和代码里不一致。原因:文档可能是早期版本,代码改过但文档没同步。解决:以代码为准,用 Postman 逐个测接口,把实际路径和参数记下来,再回头补文档。

5. 进阶技巧:用 Postman 批量验证接口与真机调试

5.1 用 Postman 把服务器端接口跑一遍

在跑 App 之前,我习惯先用 Postman 把服务器端所有接口过一遍。新建一个 Collection,把登录、科室列表、医生列表、排班查询、提交预约这几个接口按顺序建好。登录接口返回的 token 或 userId 存到环境变量里,后面的接口直接引用,不用手动复制。

// Postman 环境变量示例 { "base_url": "http://localhost:8080/medical", "user_id": "1", "token": "" }

在登录请求的 Tests 标签里写脚本,把返回的 userId 和 token 自动存进环境变量:

// Postman Tests 脚本,登录后自动保存 userId var jsonData = pm.response.json(); pm.environment.set("user_id", jsonData.data.id); pm.environment.set("token", jsonData.data.token);

这样后面请求排班和提交预约时,URL 里直接用{{base_url}}和{{user_id}},切换环境也不用改。批量跑一遍,哪个接口返回 500 或 404 一目了然,比在 App 里点来点去快得多。

5.2 真机调试与局域网访问

模拟器虽然方便,但真机调试更能暴露问题。用数据线连上手机,打开开发者选项和 USB 调试,Android Studio 里选真机设备。注意BASE_URL要改成电脑的局域网 IP,比如http://192.168.1.100:8080/medical/。如果连不上,先关掉电脑防火墙,或者给 8080 端口放行。

# Windows 查看本机局域网 IP ipconfig # macOS / Linux ifconfig | grep "inet "

拿到 IP 后,在手机浏览器访问http://192.168.1.100:8080/medical/,如果能返回数据,说明网络通了。如果手机浏览器也打不开,检查服务器端是不是只监听了localhost,改成0.0.0.0或本机局域网 IP。

5.3 用 Logcat 过滤网络请求日志

联调阶段最怕接口报错但不知道错在哪。在 Android Studio 的 Logcat 里过滤OkHttp或Retrofit的日志,能看到完整的请求 URL、请求体和响应体。如果项目里没开日志拦截器,可以手动加一个:

// OkHttp 日志拦截器,调试阶段用 HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); logging.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(logging) .build();

加上之后,每次请求的 URL、Header、Body 和返回的 JSON 都会打印出来。如果返回 400,看请求体是不是少了字段;如果返回 500,看服务器端控制台的异常堆栈。这个习惯能省掉大量“盲猜”时间。

从那以后我每次拿到一份新源码,都强制先跑服务器端接口、再改客户端 BASE_URL、最后用 Postman 批量验证,三步走完再点 Run。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询