1. 项目概述:当技术遇见公益
去年冬天,我在小区里遇到一只受伤的流浪猫,想帮它却苦于找不到靠谱的救助渠道。这段经历让我萌生了开发小动物救助平台的想法。经过三个月的开发迭代,我们团队基于SpringBoot和微信小程序打造了一套完整的救助领养系统。这个平台目前已经接入了12家动物保护组织,累计促成300+次成功领养。
传统救助平台普遍存在响应慢、信息不透明的问题。我们的解决方案采用前后端分离架构,后端使用SpringBoot提供RESTful API,前端采用uni-app跨端框架,数据库选用MySQL 5.7(这个版本在JSON支持和性能上最平衡)。特别值得一提的是,我们为动物照片识别开发了专门的AI模型,识别准确率达到92%,比人工录入效率提升5倍。
2. 技术架构设计
2.1 后端技术栈选型
选择SpringBoot 2.7.x版本主要考虑三点:一是内嵌Tomcat简化部署,二是starter依赖能快速集成微信支付等SDK,三是Actuator端点便于监控。我们在实践中发现,配置spring.datasource.hikari.maximum-pool-size=20(根据阿里云2核4G服务器实测得出的最佳值)能平衡并发和资源消耗。
数据库设计遵循几个原则:
- 动物表(t_animal)包含geo字段存储GPS坐标,支持附近流浪动物查询
- 领养申请表(t_adoption)使用状态机模式设计status字段(0待审核 1已通过 2已拒绝)
- 捐赠记录表(t_donation)采用异步记账模式,避免支付回调阻塞主流程
java复制// 典型实体类设计示例
@Data
@Entity
public class Animal {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(columnDefinition = "POINT")
private Point location;
@Enumerated(EnumType.STRING)
private AnimalStatus status;
@OneToMany(mappedBy = "animal")
private List<AdoptionApplication> applications;
}
2.2 微信小程序端关键技术
uni-app框架的选型让我们节省了30%的开发成本,一套代码可同时发布到微信、支付宝等多平台。但要注意几个坑:
- 微信登录必须使用button的open-type="getUserInfo"
- 支付功能需要后端二次签名,不能直接在前端处理
- 地图组件要申请腾讯位置服务密钥
我们通过封装统一的请求拦截器处理了以下问题:
- 自动携带JWT token
- 401状态码跳转登录页
- 请求节流控制(特别是地图页面的频繁定位请求)
3. 核心功能实现细节
3.1 动物信息管理模块
管理员后台采用Element UI开发,重点优化了批量上传功能:
- EXCEL模板包含字段校验规则
- 图片通过OSS直传,返回CDN地址
- 异步处理AI标签识别(品种、年龄等)
前端采用虚拟滚动技术优化长列表展示,每页加载20条数据。关键代码如下:
javascript复制// 实现下拉刷新和上拉加载
onReachBottom() {
if(this.loading || !this.hasNext) return
this.pageNum++
this.loadData()
},
loadData() {
this.loading = true
api.getAnimals({
pageNum: this.pageNum,
location: this.userLocation
}).then(res => {
this.list = [...this.list, ...res.data]
this.hasNext = res.hasNext
}).finally(() => this.loading = false)
}
3.2 领养流程设计
我们设计了严格的领养审核机制:
- 用户需完成实名认证
- 强制观看领养教育视频
- 三次家访检查(线上照片+视频验证)
- 电子签约具有法律效力
状态流转通过Spring StateMachine实现:
java复制@Configuration
@EnableStateMachine
public class AdoptionStateMachineConfig {
@Bean
public StateMachine<AdoptionStates, AdoptionEvents> stateMachine() {
StateMachineBuilder.Builder<AdoptionStates, AdoptionEvents> builder = StateMachineBuilder.builder();
builder.configureStates()
.withStates()
.initial(AdoptionStates.PENDING)
.states(EnumSet.allOf(AdoptionStates.class));
builder.configureTransitions()
.withExternal()
.source(AdoptionStates.PENDING)
.target(AdoptionStates.INTERVIEWING)
.event(AdoptionEvents.APPROVE);
return builder.build();
}
}
4. 性能优化实践
4.1 数据库优化
针对高频查询场景做了以下优化:
- 动物表添加复合索引 (status, location)
- 领养表使用ShardingSphere按月分表
- 热点数据用Redis缓存(TTL设置30分钟)
sql复制-- 典型查询优化示例
EXPLAIN SELECT * FROM t_animal
WHERE status = 'HEALTHY'
AND ST_Distance_Sphere(location, POINT(116.404, 39.915)) < 5000
ORDER BY create_time DESC LIMIT 20;
4.2 高并发处理
春节活动期间我们遇到瞬时5000+的并发请求,通过以下措施平稳度过:
- 支付接口采用RabbitMQ削峰填谷
- Nginx配置限流 rate=100r/s
- 关键服务降级方案:
- 地图服务不可用时改用城市区域筛选
- AI识别失败时允许手动输入
5. 踩坑与经验总结
5.1 微信生态适配问题
- 用户头像URL 24小时失效问题:
- 解决方案:获取后立即上传到自己的OSS
- 安卓机型支付白屏:
- 原因是证书过期,需要定期检查
5.2 安全防护措施
- 防刷单机制:
- 同一IP 5分钟内限3次领养申请
- 设备指纹识别重复操作
- SQL注入防护:
- 全部使用JPA Criteria API
- 动态查询用Specification封装
6. 扩展方向
当前正在开发的新功能:
- 动物健康档案区块链存证
- 智能项圈数据对接
- 领养后回访提醒系统
这套系统我们已经开源了核心模块,包括:
- 微信登录SDK封装
- 支付对账工具类
- 地图轨迹算法
在部署实施时,建议使用Docker Compose编排服务,我们的生产环境配置包含:
yaml复制version: '3'
services:
app:
image: openjdk:8-jdk-alpine
ports:
- "8080:8080"
environment:
- SPRING_PROFILES_ACTIVE=prod
mysql:
image: mysql:5.7
volumes:
- ./mysql-data:/var/lib/mysql
开发这类公益项目最大的收获是:技术不仅能创造商业价值,更能解决真实的社会问题。每次收到领养成功的用户反馈,都让我们觉得代码有了温度。