温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片!
1. 项目背景与意义
随着人们生活水平的提高,宠物已成为许多家庭的重要成员。宠物主人在为自家萌宠寻找伴侣时,往往面临信息不对称、渠道单一、匹配效率低等问题。传统的线下宠物相亲方式受地域和时间限制,难以满足宠物主人的多样化需求。因此,开发一个基于 Java Spring Boot 的萌宠宠物相亲系统,为宠物主人提供一个便捷、高效的在线宠物交友与配对平台,具有重要的现实意义和应用价值。
本系统旨在帮助宠物主人发布宠物信息、浏览其他宠物资料、筛选合适的相亲对象,并通过在线沟通促成线下见面,从而提升宠物配对的成功率和用户体验。
2. 系统需求分析
2.1 功能需求
本系统面向宠物主人和系统管理员两类角色,主要功能需求如下:
- 用户注册与登录:支持宠物主人注册账号、登录系统,并维护个人资料。
- 宠物信息管理:宠物主人可以添加、编辑、删除自家宠物的档案,包括品种、性别、年龄、照片、性格描述等。
- 宠物浏览与搜索:用户可按品种、性别、年龄、地区等条件筛选和浏览其他宠物信息。
- 相亲匹配推荐:系统根据宠物品种、年龄、地理位置等条件,为宠物推荐合适的相亲对象。
- 在线沟通:宠物主人之间可以通过站内消息进行沟通交流,约定线下见面。
- 相亲记录管理:记录每次相亲的时间、地点和结果,方便用户回顾。
- 后台管理:管理员可对用户、宠物信息、举报内容进行审核和管理。
2.2 非功能需求
- 性能:系统应支持并发访问,页面响应时间控制在 3 秒以内。
- 安全性:用户密码需加密存储,接口需进行权限校验,防止未授权访问。
- 可扩展性:系统架构应便于后续功能扩展和维护。
- 易用性:界面简洁友好,操作流程清晰,适合不同年龄段的用户使用。
3. 系统总体设计
3.1 系统架构设计
本系统采用前后端分离的 B/S 架构,后端基于 Spring Boot 框架构建 RESTful API,前端使用 Vue.js 或 Thymeleaf 模板引擎进行页面渲染。整体架构分为表现层、业务逻辑层、数据访问层和数据库层,各层职责明确、耦合度低,便于开发和维护。
系统架构图如下:
flowchart TD A[浏览器客户端] --> B[表现层 Vue.js / Thymeleaf] B --> C[业务逻辑层 Spring Boot Controller / Service] C --> D[数据访问层 MyBatis / JPA] D --> E[(MySQL 数据库)] C --> F[Redis 缓存] C --> G[文件存储 本地 / OSS]3.2 技术选型
| 层次 | 技术 | 说明 |
|---|---|---|
| 后端框架 | Spring Boot | 快速构建独立运行的 Spring 应用 |
| 持久层框架 | MyBatis-Plus | 简化数据库操作,支持分页查询 |
| 数据库 | MySQL | 存储用户、宠物、消息等业务数据 |
| 缓存 | Redis | 缓存热点数据,提升系统性能 |
| 安全框架 | Spring Security + JWT | 实现用户认证与接口授权 |
| 前端技术 | Vue.js / Thymeleaf | 页面渲染与交互 |
| 构建工具 | Maven | 项目依赖管理与构建 |
3.3 数据库设计
根据系统需求,数据库主要包含以下核心数据表:
- 用户表(user):存储用户账号、密码、昵称、头像、联系方式等信息。
- 宠物表(pet):存储宠物名称、品种、性别、年龄、照片、性格描述、所属用户等信息。
- 相亲记录表(match_record):记录相亲双方宠物、时间、地点、结果等信息。
- 消息表(message):存储用户之间的站内沟通消息。
- 举报表(report):记录用户对不良内容的举报信息。
各表之间通过外键关联,例如宠物表通过用户 ID 关联用户表,相亲记录表通过宠物 ID 关联宠物表,从而保证数据的完整性和一致性。
4. 系统功能模块实现
4.1 用户注册与登录模块
用户注册时,前端提交用户名、密码、手机号等信息,后端对密码进行 BCrypt 加密后存入数据库。登录时,后端校验用户名和密码,验证通过后生成 JWT Token 返回给前端,前端在后续请求中携带该 Token 以完成身份认证。
@RestController @RequestMapping("/api/auth") public class AuthController { @Autowired private UserService userService; @Autowired private JwtUtil jwtUtil; @PostMapping("/register") public Result register(@RequestBody UserRegisterDTO dto) { userService.register(dto); return Result.success("注册成功"); } @PostMapping("/login") public Result login(@RequestBody UserLoginDTO dto) { User user = userService.login(dto); String token = jwtUtil.generateToken(user.getId(), user.getUsername()); return Result.success(new LoginVO(token, user)); } }4.2 宠物信息管理模块
宠物主人登录后,可以进入「我的宠物」页面添加宠物档案。添加宠物时需填写宠物名称、品种、性别、年龄、性格描述等信息,并上传宠物照片。后端将照片保存至文件存储服务,并将宠物信息写入数据库。
@Service public class PetServiceImpl implements PetService { @Autowired private PetMapper petMapper; @Override public void addPet(PetAddDTO dto, Long userId) { Pet pet = new Pet(); BeanUtils.copyProperties(dto, pet); pet.setOwnerId(userId); pet.setStatus(1); petMapper.insert(pet); } @Override public PageResult<PetVO> listPets(PetQueryDTO dto) { Page<Pet> page = new Page<>(dto.getPageNum(), dto.getPageSize()); LambdaQueryWrapper<Pet> wrapper = new LambdaQueryWrapper<>(); if (StringUtils.hasText(dto.getBreed())) { wrapper.eq(Pet::getBreed, dto.getBreed()); } if (dto.getGender() != null) { wrapper.eq(Pet::getGender, dto.getGender()); } wrapper.orderByDesc(Pet::getCreateTime); Page<Pet> result = petMapper.selectPage(page, wrapper); return new PageResult<>(result.getRecords(), result.getTotal()); } }4.3 相亲匹配推荐模块
系统根据当前宠物的品种、性别、年龄和所在地区,从宠物库中筛选出符合条件的候选宠物,并按匹配度进行排序推荐。匹配度综合考虑品种兼容性、年龄差、距离等因素,为用户提供个性化的相亲建议。
@Service public class MatchServiceImpl implements MatchService { @Autowired private PetMapper petMapper; @Override public List<PetVO> recommendPets(Long petId) { Pet currentPet = petMapper.selectById(petId); // 查询异性、同品种或相近品种的宠物 LambdaQueryWrapper<Pet> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(Pet::getGender, currentPet.getGender() == 1 ? 2 : 1); wrapper.eq(Pet::getBreed, currentPet.getBreed()); wrapper.ne(Pet::getId, petId); wrapper.eq(Pet::getStatus, 1); List<Pet> pets = petMapper.selectList(wrapper); // 按年龄差排序,年龄差越小匹配度越高 pets.sort(Comparator.comparingInt(p -> Math.abs(p.getAge() - currentPet.getAge()))); return pets.stream().map(this::toVO).collect(Collectors.toList()); } }4.4 在线沟通模块
用户可以在宠物详情页点击「联系主人」按钮,进入站内聊天界面。聊天消息通过 WebSocket 实时推送,后端将消息持久化到数据库,保证离线消息不丢失。
@Component public class ChatWebSocketHandler extends TextWebSocketHandler { private static final Map<Long, WebSocketSession> SESSIONS = new ConcurrentHashMap<>(); @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { Long userId = (Long) session.getAttributes().get("userId"); SESSIONS.put(userId, session); } @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { // 解析消息并转发给接收方 ChatMessage chatMessage = JSON.parseObject(message.getPayload(), ChatMessage.class); WebSocketSession targetSession = SESSIONS.get(chatMessage.getReceiverId()); if (targetSession != null && targetSession.isOpen()) { targetSession.sendMessage(new TextMessage(message.getPayload())); } // 消息持久化 messageService.save(chatMessage); } }4.5 后台管理模块
管理员登录后台后,可以对注册用户进行管理(禁用、删除)、对宠物信息进行审核(通过、下架)、对用户举报进行处理。后台管理界面采用独立的布局,通过角色权限控制,确保只有管理员才能访问相关接口。
5. 系统测试
5.1 测试环境
系统测试在本地开发环境进行,使用 JUnit 和 Postman 对后端接口进行单元测试和接口测试,使用浏览器对前端页面进行功能测试。
5.2 功能测试
对用户注册登录、宠物信息管理、相亲匹配推荐、在线沟通、后台管理等核心功能进行了全面测试。测试结果表明,各功能模块运行正常,数据读写准确,接口响应符合预期。
5.3 性能测试
使用 JMeter 对系统进行简单的并发压力测试。在 100 个并发用户同时访问的场景下,系统平均响应时间约为 1.2 秒,未出现请求失败或数据异常的情况,满足预期的性能要求。
6. 总结与展望
本文设计并实现了一个基于 Java Spring Boot 的萌宠宠物相亲系统。系统实现了用户注册登录、宠物信息管理、相亲匹配推荐、在线沟通和后台管理等核心功能,能够为宠物主人提供便捷的宠物交友与配对服务。通过前后端分离的架构设计和合理的数据库设计,系统具有良好的可维护性和可扩展性。
在后续的迭代中,可以考虑引入基于地理位置的服务(LBS)实现附近宠物推荐,结合机器学习算法优化相亲匹配的准确度,并增加宠物健康档案、疫苗接种提醒等增值功能,进一步提升用户体验和系统的实用价值。