1. 项目背景与核心需求
养宠交流系统是近年来随着宠物经济崛起而出现的新型社交平台。作为一名同时具备SpringBoot后端和Android开发经验的程序员,我在去年毕业季接手了这个选题。当时市面上已有的宠物类App要么功能过于简单,要么商业化气息太重,缺少一个真正以宠物主人需求为核心的轻量级交流平台。
这个系统的核心价值在于解决了三个痛点:
- 宠物主人之间的经验分享缺乏有效渠道
- 宠物服务信息(如医院、美容)分散在各个平台
- 宠物日常管理(如疫苗提醒、饮食记录)没有专业工具
技术栈选择SpringBoot+Android的组合主要基于以下考虑:
- SpringBoot的快速开发特性适合毕业设计的有限周期
- Android原生应用能更好调用设备硬件(如相机、GPS)
- 前后端分离架构便于后期功能扩展
- 这两个技术栈的就业市场需求量大,对毕业生求职有帮助
2. 系统架构设计
2.1 整体技术架构
系统采用经典的三层架构:
[Android客户端] ↔ [SpringBoot REST API] ↔ [MySQL数据库]
关键组件说明:
- 客户端:Android原生开发(Java+Kotlin混合)
- 服务端:SpringBoot 2.7 + Spring Security + MyBatis Plus
- 数据库:MySQL 8.0(开发环境用H2内存数据库)
- 消息推送:极光推送JPush
- 图片存储:七牛云对象存储
- 实时通讯:WebSocket协议实现
2.2 数据库设计要点
核心表结构设计时特别注意了宠物数据的特殊性:
CREATE TABLE `pet_info` (
`pet_id` bigint NOT NULL AUTO_INCREMENT,
`user_id` bigint NOT NULL COMMENT '主人ID',
`pet_type` tinyint NOT NULL COMMENT '1-猫 2-狗 3-其他',
`breed_id` int DEFAULT NULL COMMENT '品种ID',
`pet_name` varchar(20) NOT NULL,
`birth_date` date DEFAULT NULL,
`adoption_date` date DEFAULT NULL,
`weight` decimal(5,2) DEFAULT NULL COMMENT '公斤',
`sterilization` tinyint DEFAULT '0' COMMENT '是否绝育',
`avatar_url` varchar(255) DEFAULT NULL,
`medical_history` text COMMENT '病史JSON',
PRIMARY KEY (`pet_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
特殊设计考虑:
- 医疗史采用JSON格式存储非结构化数据
- 品种单独建表支持智能推荐
- 时间字段统一使用DATE类型便于计算年龄
3. 核心功能实现
3.1 社区动态模块
这是系统的核心交互功能,实现时遇到的主要挑战是图片处理:
// Android端图片压缩处理
public static File compressImage(File originalFile) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(originalFile.getPath(), options);
// 计算采样率
options.inSampleSize = calculateInSampleSize(options, 1024, 1024);
options.inJustDecodeBounds = false;
Bitmap compressedBitmap = BitmapFactory.decodeFile(originalFile.getPath(), options);
File outputFile = new File(originalFile.getParent(), "compressed_" + originalFile.getName());
try (FileOutputStream out = new FileOutputStream(outputFile)) {
compressedBitmap.compress(Bitmap.CompressFormat.JPEG, 80, out);
} catch (IOException e) {
e.printStackTrace();
}
return outputFile;
}
服务端采用异步处理策略:
- 接收图片后立即返回响应
- 通过消息队列处理缩略图生成
- 使用CDN加速图片访问
3.2 宠物健康管理
疫苗提醒功能的实现要点:
// 基于AlarmManager的定时提醒
public void setVaccineReminder(Context context, long triggerAtMillis,
String petName, String vaccineType) {
Intent intent = new Intent(context, VaccineReceiver.class);
intent.putExtra("pet_name", petName);
intent.putExtra("vaccine_type", vaccineType);
PendingIntent pendingIntent = PendingIntent.getBroadcast(
context,
(int) System.currentTimeMillis(),
intent,
PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager =
(AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
alarmManager.setExactAndAllowWhileIdle(
AlarmManager.RTC_WAKEUP,
triggerAtMillis,
pendingIntent);
}
}
数据库设计上采用日历事件表+重复规则字段的方案,支持灵活设置周期性提醒。
4. 开发中的关键问题与解决方案
4.1 位置服务优化
宠物社交对位置信息有强需求,但持续获取GPS会极大耗电。我们的解决方案:
-
智能位置更新策略:
- 前台使用时高精度定位
- 后台时切换为被动定位模式
- 根据移动速度动态调整采样频率
-
Android端代码实现:
private void createLocationRequest() {
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(10000);
mLocationRequest.setFastestInterval(5000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
// 根据电量情况调整策略
BatteryManager bm = (BatteryManager) getSystemService(BATTERY_SERVICE);
int batLevel = bm.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY);
if (batLevel > 50) {
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
} else if (batLevel > 20) {
mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
} else {
mLocationRequest.setPriority(LocationRequest.PRIORITY_LOW_POWER);
}
}
4.2 即时通讯性能优化
使用WebSocket实现聊天功能时,遇到的消息堆积问题解决方案:
-
服务端采用分级存储策略:
- 最新消息存Redis
- 历史消息存MySQL
- 图片/视频存对象存储
-
Android端消息分页加载实现:
public void loadMoreMessages(long lastMessageId, int pageSize) {
String url = BASE_URL + "/messages?lastId=" + lastMessageId
+ "&size=" + pageSize;
JsonObjectRequest request = new JsonObjectRequest(
Request.Method.GET,
url,
null,
response -> {
// 解析消息列表
List<Message> newMessages = parseMessages(response);
// 更新RecyclerView
adapter.appendMessages(newMessages);
},
error -> {
// 错误处理
});
request.setRetryPolicy(new DefaultRetryPolicy(
3000,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
queue.add(request);
}
5. 部署与调试经验
5.1 远程调试配置
开发过程中最实用的调试配置:
- Android端配置:
<!-- AndroidManifest.xml -->
<application
android:usesCleartextTraffic="true"
android:networkSecurityConfig="@xml/network_security_config">
<!-- res/xml/network_security_config.xml -->
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">192.168.1.100</domain>
</domain-config>
</network-security-config>
- SpringBoot端application-dev.properties配置:
# 开发环境配置
server.address=0.0.0.0
logging.level.com.pet.app=DEBUG
# 允许跨域
spring.mvc.cors.allowed-origins=*
spring.mvc.cors.allowed-methods=*
5.2 持续集成实践
使用Jenkins搭建的自动化流程:
- 代码提交触发Git Hook
- 运行单元测试和静态检查
- 构建Android APK和SpringBoot Jar包
- 部署到测试服务器
- 发送构建结果通知
关键Jenkinsfile配置片段:
pipeline {
agent any
stages {
stage('Build Backend') {
steps {
sh './mvnw clean package -DskipTests'
archiveArtifacts artifacts: 'target/*.jar', fingerprint: true
}
}
stage('Build Android') {
steps {
dir('android') {
sh './gradlew assembleDebug'
archiveArtifacts artifacts: 'app/build/outputs/apk/debug/*.apk', fingerprint: true
}
}
}
}
post {
always {
emailext body: '构建详情:${BUILD_URL}',
subject: '构建通知:${JOB_NAME} - ${BUILD_NUMBER}',
to: 'team@example.com'
}
}
}
6. 项目扩展与优化方向
6.1 机器学习应用
后续可扩展的智能功能:
- 宠物图片识别品种
- 饮食推荐算法
- 异常行为检测(通过运动传感器数据)
TensorFlow Lite集成示例:
// Android端模型加载
try {
PetClassifier classifier = PetClassifier.newInstance(context);
// 转换输入图片
TensorImage image = TensorImage.fromBitmap(bitmap);
// 运行推理
PetClassifier.Outputs outputs = classifier.process(image);
List<Category> predictions = outputs.getProbabilityAsCategoryList();
// 处理结果
predictions.sort((o1, o2) -> Float.compare(o2.getScore(), o1.getScore()));
String topResult = predictions.get(0).getLabel();
} catch (IOException e) {
Log.e("PetClassifier", "模型加载失败", e);
}
6.2 微服务化改造
当用户量增长后,可以考虑的架构演进:
- 将用户服务、社区服务、健康服务拆分为独立微服务
- 引入Spring Cloud Alibaba组件
- 使用Nacos作为服务发现中心
- 采用Sentinel进行流量控制
示例服务拆分:
原单体架构:
pet-app
├── user
├── community
└── health
改造为:
pet-user-service
pet-community-service
pet-health-service
pet-gateway
7. 毕业设计心得
这个项目从技术选型到最终答辩历时4个月,总结几点重要经验:
-
原型设计阶段就要考虑Android权限管理,特别是:
- 存储权限(Android 11作用域存储)
- 位置权限(后台定位限制)
- 相机权限(部分厂商的特殊限制)
-
SpringBoot接口设计要预留版本号:
@RestController
@RequestMapping("/api/v1/pets")
public class PetController {
// ...
}
-
数据库迁移一定要用Flyway或Liquibase管理,毕业答辩时演示环境重建是常事
-
压力测试要趁早,我们直到最后阶段才发现社区列表接口没有分页,当测试数据达到1万条时响应时间超过5秒
-
文档编写要和技术开发同步进行,推荐使用Swagger UI自动生成API文档:
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.basePackage("com.pet.app"))
.paths(PathSelectors.any())
.build();
}
这个项目最终获得了优秀毕业设计,关键不在于技术有多复杂,而在于完整实现了产品闭环,从需求分析到上线部署的全流程实践,这对我的职业发展产生了深远影响。现在回头看,有些代码值得优化,但那种从0到1的实践经历才是最宝贵的财富。

370


被折叠的 条评论
为什么被折叠?



