去年疫情期间,我在小区里亲眼目睹了多起因主人被隔离导致宠物无人照料的紧急情况。当时社区工作人员和热心邻居们只能通过微信群接力转发求助信息,效率低下且信息容易遗漏。这段经历让我萌生了开发社区宠物救助系统的想法——通过数字化手段解决疫情期间宠物救助的痛点问题。
这个基于Java的社区宠物救助平台,本质上是一个连接宠物主人、志愿者和救助机构的三方协作系统。其核心价值在于:
提示:系统特别设计了"紧急程度"标识功能,带红色感叹号的求助信息会优先推送给志愿者,这是我们在实际测试中发现的关键设计点
采用经典的SpringBoot+Vue前后端分离架构,主要基于以下考量:
mermaid复制graph TD
A[前端Vue.js] -->|Axios请求| B[SpringBoot后端]
B --> C[MySQL数据库]
B --> D[Redis缓存]
C --> E[宠物信息表]
C --> F[救助工单表]
(注:实际开发中应避免使用Mermaid图表,此处仅为说明架构关系)
系统最关键的三个实体关系:
宠物档案表(pet_info)
sql复制CREATE TABLE `pet_info` (
`id` int NOT NULL AUTO_INCREMENT,
`pet_name` varchar(20) NOT NULL COMMENT '宠物名称',
`pet_type` enum('犬','猫','其他') NOT NULL,
`health_status` varchar(50) DEFAULT NULL COMMENT '如"患有糖尿病需每日注射胰岛素"',
`qr_code` varchar(255) DEFAULT NULL COMMENT '宠物专属二维码',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
救助工单表(rescue_order)
java复制@Entity
public class RescueOrder {
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
@Enumerated(EnumType.STRING)
private UrgencyLevel urgency; // 紧急程度枚举
@ManyToOne
@JoinColumn(name="volunteer_id")
private Volunteer volunteer; // 关联志愿者
// 工单状态机设计
public enum Status {
PENDING, ACCEPTED, IN_PROGRESS, COMPLETED
}
}
志愿者能力标签表(volunteer_skill)
sql复制CREATE TABLE `volunteer_skill` (
`volunteer_id` int NOT NULL,
`skill_tag` varchar(20) NOT NULL COMMENT '如"医疗护理""宠物寄养"',
PRIMARY KEY (`volunteer_id`,`skill_tag`)
);
注意:实际开发中建议为宠物表添加全文索引,以支持复杂搜索条件:
sql复制ALTER TABLE pet_info ADD FULLTEXT INDEX ft_search (pet_name, health_status);
系统核心的志愿者匹配逻辑采用"地理位置优先+技能匹配"的复合算法:
java复制public List<Volunteer> matchVolunteers(RescueOrder order) {
// 半径5公里范围内的志愿者
String hql = "FROM Volunteer v WHERE " +
"ST_Distance(point(:lng,:lat), point(v.longitude,v.latitude)) < 5 " +
"AND v.status = 'AVAILABLE'";
List<Volunteer> candidates = entityManager
.createQuery(hql, Volunteer.class)
.setParameter("lng", order.getLongitude())
.setParameter("lat", order.getLatitude())
.getResultList();
// 技能标签匹配度排序
return candidates.stream()
.sorted(Comparator.comparingInt(v ->
-skillMatchScore(v.getSkills(), order.getRequiredSkills())))
.collect(Collectors.toList());
}
private int skillMatchScore(Set<String> volunteerSkills, Set<String> requiredSkills) {
return (int) volunteerSkills.stream()
.filter(requiredSkills::contains)
.count();
}
针对疫情期间的特殊需求,我们实现了以下功能:
无接触交接:
紧急求助通道:
java复制@PostMapping("/emergency")
public ResponseData createEmergencyOrder(@Valid @RequestBody EmergencyRequest request) {
if (request.isUrgent()) {
// 紧急工单跳过审核直接推送
rescueService.createOrder(request, true);
notificationService.sendEmergencyAlert(request.getAreaCode());
}
// ...
}
健康状态追踪:
最初使用微信模板消息推送救助状态变更,但在测试时发现:
解决方案:
对比了三种方案:
| 方案 | 精度 | 成本 | 适用场景 |
|---|---|---|---|
| 高德地图API | 高 | 按次计费 | 精确定位 |
| IP定位 | 低 | 免费 | 城市级定位 |
| 微信定位SDK | 中 | 免费 | 移动端集成 |
最终选择组合方案:
早期版本出现过多个志愿者同时接同一订单的情况,通过以下方案解决:
java复制@Transactional
public boolean acceptOrder(Long orderId, Long volunteerId) {
RescueOrder order = orderRepository.findById(orderId)
.orElseThrow(() -> new BusinessException("订单不存在"));
// 乐观锁控制
if (order.getStatus() != Status.PENDING) {
return false;
}
order.setStatus(Status.ACCEPTED);
order.setVolunteer(new Volunteer(volunteerId));
orderRepository.save(order);
// 记录接单时间
orderLogService.logAction(orderId, "ACCEPT", volunteerId);
return true;
}
经过压力测试得出的最低配置要求:
开发环境:
生产环境(预计1000用户):
索引优化:
sql复制-- 救助工单表的常用查询字段
ALTER TABLE rescue_order
ADD INDEX idx_area_status (area_code, status),
ADD INDEX idx_geo (longitude, latitude);
连接池配置(application.yml):
yaml复制spring:
datasource:
hikari:
maximum-pool-size: 20
connection-timeout: 30000
idle-timeout: 600000
max-lifetime: 1800000
缓存策略:
接口防护:
数据安全:
java复制@Converter
public class PhoneNumberConverter implements AttributeConverter<String, String> {
private static final String KEY = "your-aes-key";
public String convertToDatabaseColumn(String attribute) {
return AES.encrypt(attribute, KEY);
}
public String convertToEntityAttribute(String dbData) {
return AES.decrypt(dbData, KEY);
}
}
在实际使用中,我们收集到用户提出的几个有价值的扩展需求:
宠物健康档案:
智能硬件集成:
社区互助网络:
这个项目给我最深的体会是:技术解决方案必须扎根于真实场景。比如我们最初设计的复杂审核流程,在实际疫情紧急情况下反而成了障碍,后来简化为"紧急工单直通+事后报备"模式。建议开发者在使用这套系统时,多与一线救助人员沟通,不断调整功能细节。