1. 项目背景与核心价值
校园流浪动物问题一直是高校管理中的痛点。每到毕业季,总会有大量被遗弃的宠物在校园内游荡,它们面临着食物短缺、疾病威胁和安全隐患。作为一名在校园里经常投喂流浪猫的程序员,我深刻体会到需要一套系统化的解决方案来协调救助资源。
这个基于SpringBoot的救助平台主要解决三个核心问题:
- 信息不对称:流浪动物目击信息和救助需求分散在各个社交平台
- 资源浪费:重复救助和物资分配不均
- 管理困难:缺乏统一的动物档案和跟踪机制
技术选型上采用SpringBoot+MyBatis组合,主要考虑:
- 快速迭代:校园场景需求变化快,SpringBoot的自动配置特性特别适合
- 轻量部署:学校服务器资源有限,内嵌Tomcat的部署方式最经济
- 数据安全:MyBatis的SQL可控性比JPA更适合动物医疗数据的复杂查询
2. 系统架构设计
2.1 技术栈全景图
code复制前端:Thymeleaf + Bootstrap + jQuery
后端:SpringBoot 2.7 + MyBatis 3.5
数据库:MySQL 8.0(兼容SQLServer)
中间件:Redis缓存 + Quartz定时任务
2.2 核心模块划分
- 动物档案管理:RFID芯片信息录入与查询
- 救助任务系统:基于地理围栏的任务分发
- 物资管理:捐赠物资的入库出库跟踪
- 志愿者管理:服务时长认证与排班
- 医疗记录:绝育/疫苗的电子档案
特别注意:动物位置信息使用GeoHash算法处理,既保证查询效率又避免精确坐标暴露风险
3. 关键实现细节
3.1 多源文件上传设计
参考项目中的FileController,我们做了这些优化:
java复制// 文件存储策略
String storageType = configService.getValue("storage.type");
if("aliyun".equals(storageType)){
// 使用OSS存储医疗影像
} else {
// 本地存储时自动创建日期目录
String datePath = new SimpleDateFormat("yyyyMMdd").format(new Date());
File upload = new File(path.getAbsolutePath(),"/upload/"+datePath);
}
3.2 志愿者权限控制
采用RBAC模型扩展:
sql复制CREATE TABLE `volunteer_role` (
`id` int NOT NULL AUTO_INCREMENT,
`role_name` varchar(20) COMMENT '角色名',
`animal_edit` tinyint DEFAULT 0 COMMENT '编辑动物权限',
`medical_access` tinyint DEFAULT 0 COMMENT '查看医疗记录',
`task_assign` tinyint DEFAULT 0 COMMENT '分配任务权限',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
4. 典型业务场景实现
4.1 流浪动物登记流程
- 扫码识别已有芯片(NFC读取)
- 无芯片时新建档案:
- 必填项:发现位置、体貌特征
- 自动生成二维码标签
- 触发首次体检任务
4.2 物资申领算法
java复制public List<Supplies> allocateSupplies(ApplyForm form) {
// 优先级:急救物资 > 常规申请 > 预防性物资
return suppliesList.stream()
.filter(s -> s.getStock() > 0)
.sorted(Comparator.comparing(Supplies::getPriority)
.thenComparing(Supplies::getExpireDate))
.limit(form.getAmount())
.collect(Collectors.toList());
}
5. 性能优化实践
5.1 热点数据缓存
动物基本信息使用Redis缓存:
properties复制# application.properties
spring.cache.type=redis
spring.redis.time-to-live=3600000
5.2 批量处理优化
医疗记录导入采用MyBatis批量插入:
xml复制<insert id="batchInsert" parameterType="java.util.List">
INSERT INTO medical_record
(animal_id, type, result) VALUES
<foreach collection="list" item="item" separator=",">
(#{item.animalId}, #{item.type}, #{item.result})
</foreach>
</insert>
6. 安全防护措施
6.1 敏感数据加密
志愿者联系方式加密存储:
java复制@Convert(converter = CryptoConverter.class)
private String phone;
// 使用JPA AttributeConverter
public class CryptoConverter implements AttributeConverter<String, String> {
private static final String KEY = "saf3ty@2023";
public String convertToDatabaseColumn(String attribute) {
// AES加密实现
}
}
6.2 防SQL注入
所有查询严格使用MyBatis参数化查询:
xml复制<select id="searchAnimals" resultType="Animal">
SELECT * FROM animal
WHERE status = #{status}
<if test="location != null">
AND location LIKE CONCAT(#{location}, '%')
</if>
</select>
7. 部署注意事项
7.1 多环境配置
使用Profile区分配置:
bash复制# 启动命令示例
java -jar animal-rescue.jar --spring.profiles.active=prod
7.2 数据库连接池调优
yaml复制spring:
datasource:
hikari:
maximum-pool-size: 20
connection-timeout: 30000
idle-timeout: 600000
max-lifetime: 1800000
8. 踩坑实录
-
地理位置搜索性能问题:
- 初期直接使用ST_Distance_Sphere函数导致CPU飙升
- 解决方案:改用GeoHash预处理+范围查询
-
定时任务堆积:
- Quartz默认内存存储导致任务丢失
- 最终采用JDBCJobStore持久化到数据库
-
文件上传漏洞:
- 曾出现用户上传.jsp文件导致安全问题
- 修复方案:白名单校验+重命名存储
关键教训:校园环境要特别防范CSRF攻击,所有表单必须添加_csrf令牌
9. 扩展方向
-
微信小程序集成:
- 开发轻量级上报入口
- 结合校园地图实现位置标注
-
智能喂食器对接:
- 通过MQTT协议接收投喂数据
- 电量监控和异常报警
-
疫苗提醒服务:
- 基于医疗记录计算下次接种时间
- 自动推送短信提醒
这个项目从技术角度看不算复杂,但真正在校园落地时需要特别注意三个要点:1) 与后勤系统的数据对接 2) 志愿者培训机制 3) 隐私保护边界。我们在第二版迭代时专门增加了数据脱敏导出功能,既能满足动物保护组织的数据需求,又避免了个人信息泄露风险。