1. 项目背景与核心价值
作为一名长期从事移动应用开发的工程师,我见过太多医疗类应用要么功能臃肿,要么操作复杂。这个家庭医务助手APP的设计初衷很明确——为普通家庭提供简单实用的健康管理工具。不同于医院级系统,它更注重日常健康监测、用药提醒和基础医疗记录这些高频需求。
SpringBoot+Android的技术组合在当前移动开发领域非常典型。后端采用SpringBoot可以快速搭建RESTful API服务,处理用户数据存储、用药提醒推送等逻辑;Android原生开发则能充分利用设备硬件能力,比如调用摄像头拍摄伤口照片、使用传感器记录步数等。这种前后端分离的架构既保证了系统扩展性,又确保了移动端的性能体验。
从毕设角度来说,这个项目完整覆盖了:
- 后端API开发(SpringBoot)
- 移动端UI/UX设计(Android)
- 数据持久化(SQLite+MySQL)
- 系统集成与测试
这些内容足够展示一个计算机专业学生的全栈开发能力。我指导过的几个学生采用类似架构的毕设,最后都获得了优秀成绩。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计详解
2.1 技术栈选型分析
后端选择SpringBoot而非传统SSM框架,主要考虑三点:
- 自动配置特性大幅减少XML配置,比如用
@SpringBootApplication一个注解就替代了原来需要配置的组件扫描、事务管理等 - 内嵌Tomcat服务器,开发阶段直接运行main方法即可启动,部署时打包成jar就能运行
- 丰富的Starter依赖,比如集成Redis缓存只需添加spring-boot-starter-data-redis依赖
Android端采用Java而非Kotlin开发,虽然Kotlin现在已是官方推荐语言,但考虑到:
- 大多数高校教学仍以Java为主
- 第三方库的Java示例更丰富
- 编译兼容性更好(特别是在老旧设备上)
数据库方案设计:
java复制// 用户健康数据实体类示例
@Entity
public class HealthRecord {
@Id
@GeneratedValue
private Long id;
@Column(nullable=false)
private Long userId;
private Double temperature; //体温
private Integer heartRate; //心率
private String symptoms; //症状描述
@Temporal(TemporalType.TIMESTAMP)
private Date recordTime;
}
2.2 核心功能模块拆解
2.2.1 健康数据记录
采用MVP模式实现:
- Model层:Room数据库操作
- View层:自定义折线图展示历史数据
- Presenter层:处理数据校验与持久化
关键代码片段:
java复制// 体温记录逻辑
public void saveTemperature(double value) {
if(value < 35 || value > 42) {
throw new IllegalArgumentException("体温值异常");
}
HealthRecord record = new HealthRecord();
record.setTemperature(value);
record.setRecordTime(new Date());
database.healthDao().insert(record);
}
2.2.2 用药提醒系统
使用Android的AlarmManager实现定时提醒:
xml复制<!-- AndroidManifest.xml需声明权限 -->
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/>
提醒服务核心逻辑:
java复制Intent intent = new Intent(context, ReminderReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(
context, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(ALARM_SERVICE);
alarmManager.setExactAndAllowWhileIdle(
AlarmManager.RTC_WAKEUP,
triggerTime,
pendingIntent);
3. 开发环境搭建指南
3.1 后端开发环境
推荐使用IntelliJ IDEA 2023+版本,需配置:
- JDK 17(SpringBoot 3.x要求最低JDK17)
- Maven 3.8+
- 数据库可选H2(开发环境)或MySQL(生产环境)
关键依赖示例:
xml复制<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
</dependencies>
3.2 Android开发环境
Android Studio配置要点:
- 安装Android SDK 33(API Level 33)
- 配置Java 11兼容环境
- 启用AndroidX库
常见问题解决方案:
如果构建时报"Failed to find target with hash string",需要:
- 打开SDK Manager
- 安装对应版本的Android SDK Platform
- 在build.gradle中确认compileSdkVersion匹配
4. 关键功能实现细节
4.1 前后端数据交互
采用RESTful API设计规范:
- GET /api/records - 获取健康记录列表
- POST /api/records - 创建新记录
- PUT /api/records/{id} - 更新记录
- DELETE /api/records/{id} - 删除记录
SpringBoot控制器示例:
java复制@RestController
@RequestMapping("/api/records")
public class RecordController {
@Autowired
private RecordService recordService;
@GetMapping
public ResponseEntity<List<HealthRecord>> getRecords(
@RequestParam(required = false) Long userId) {
return ResponseEntity.ok(recordService.getRecords(userId));
}
}
Android端使用Retrofit进行网络请求:
java复制public interface ApiService {
@GET("records")
Call<List<HealthRecord>> getRecords(@Query("userId") Long userId);
}
// 使用示例
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://your-server-ip:8080/")
.addConverterFactory(GsonConverterFactory.create())
.build();
ApiService service = retrofit.create(ApiService.class);
Call<List<HealthRecord>> call = service.getRecords(123L);
call.enqueue(new Callback<List<HealthRecord>>() {
@Override
public void onResponse(Call<List<HealthRecord>> call,
Response<List<HealthRecord>> response) {
// 处理响应数据
}
});
4.2 本地数据缓存策略
采用Room+LiveData实现:
java复制@Dao
public interface RecordDao {
@Query("SELECT * FROM health_record WHERE userId = :userId")
LiveData<List<HealthRecord>> getRecordsByUser(long userId);
@Insert
void insert(HealthRecord record);
}
// 在ViewModel中观察数据变化
recordDao.getRecordsByUser(userId).observe(this, records -> {
// 更新UI
});
5. 项目部署与测试
5.1 后端部署方案
推荐两种部署方式:
- 传统JAR部署:
bash复制mvn clean package
java -jar target/family-doctor-0.0.1.jar
- Docker容器化(需要Dockerfile):
dockerfile复制FROM openjdk:17-jdk-slim
COPY target/family-doctor-0.0.1.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
5.2 Android应用打包
发布流程注意事项:
- 生成签名密钥:
bash复制keytool -genkey -v -keystore my-release-key.jks
-keyalg RSA -keysize 2048 -validity 10000
-alias my-alias
- 配置build.gradle:
groovy复制android {
signingConfigs {
release {
storeFile file("my-release-key.jks")
storePassword "password"
keyAlias "my-alias"
keyPassword "password"
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
}
6. 毕设答辩准备建议
6.1 演示重点设计
建议按以下顺序演示:
- 用户注册/登录流程(展示JWT认证)
- 健康数据录入(演示表单验证)
- 历史数据可视化(展示图表组件)
- 用药提醒触发(测试AlarmManager)
- 数据同步功能(切换网络状态演示)
6.2 常见答辩问题准备
-
为什么选择SpringBoot而不是其他框架?
- 标准答案:SpringBoot的约定优于配置、快速开发特性非常适合毕业项目的时间要求,同时其生态丰富可以方便地扩展功能。
-
如何保证用户隐私数据安全?
- 应提及:HTTPS传输、数据加密存储、权限控制等
-
系统的扩展性体现在哪里?
- 可以讨论:微服务化改造可能、添加新健康指标的支持等
7. 开发经验与避坑指南
7.1 时间管理建议
根据我带学生的经验,合理的时间分配应该是:
- 第1周:需求分析与技术调研
- 第2-3周:后端API开发
- 第4-5周:Android端UI实现
- 第6周:系统集成测试
- 第7周:文档编写与答辩准备
7.2 常见问题解决方案
-
Android模拟器无法连接本地后端:
- 解决方法:使用10.0.2.2代替localhost访问开发机服务
-
Room数据库升级处理:
java复制// 在Database类中添加
@Database(entities = {HealthRecord.class}, version = 2)
public abstract class AppDatabase extends RoomDatabase {
// 添加迁移处理
static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(SupportSQLiteDatabase database) {
database.execSQL("ALTER TABLE health_record ADD COLUMN notes TEXT");
}
};
}
- SpringBoot跨域问题:
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("*");
}
}
这个项目最让我印象深刻的是用药提醒功能的实现细节。在实际测试中发现,不同Android版本对AlarmManager的限制差异很大。特别是在Android 6.0之后,系统引入了Doze模式,会导致定时提醒延迟。最终我们采用WorkManager+AlarmManager的混合方案来保证提醒的准时性。这种在课本上不会提到的实战经验,恰恰是毕设项目中最有价值的部分。
