1. 项目概述与技术栈选型
这个宠物领养系统采用前后端分离架构,后端基于SpringBoot2框架构建,前端使用Vue3实现,数据持久层采用MyBatis-Plus,数据库选用MySQL8.0。整套系统源码包含完整的前后端实现和项目文档,适合作为全栈开发学习案例或二次开发基础。
技术栈组合的选择体现了当前Java Web开发的主流趋势:
- SpringBoot2(2.7.x版本)提供了自动配置、起步依赖等特性,大幅简化了传统SSM框架的配置复杂度
- Vue3的组合式API相比Options API更灵活,配合TypeScript可获得更好的类型支持
- MyBatis-Plus在MyBatis基础上增强了CRUD操作,内置分页插件、代码生成器等实用功能
- MySQL8.0在性能(比5.7提升2倍)、JSON支持、窗口函数等方面有显著改进
提示:实际开发时建议保持技术栈版本一致,如SpringBoot2.7.15 + MyBatis-Plus3.5.3.1 + Vue3.3.x,避免因版本差异导致兼容性问题。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统核心功能模块设计
2.1 用户管理模块
采用RBAC权限模型设计,包含:
- 普通用户:注册/登录、个人信息管理、宠物收藏
- 管理员:用户审核、权限分配、操作日志查看
- 采用JWT进行无状态认证,accessToken有效期2小时,refreshToken有效期7天
java复制// 用户登录核心代码示例
@PostMapping("/login")
public Result<LoginVO> login(@RequestBody LoginDTO dto) {
User user = userService.lambdaQuery()
.eq(User::getUsername, dto.getUsername())
.one();
if(!passwordEncoder.matches(dto.getPassword(), user.getPassword())){
return Result.fail("密码错误");
}
String token = jwtUtil.generateToken(user);
return Result.success(new LoginVO(token, user.getRole()));
}
2.2 宠物信息管理
包含宠物分类、详情、状态(待领养/已领养)管理:
- 采用阿里云OSS存储宠物图片
- 实现Elasticsearch全文检索(名称、品种、特点)
- 支持多条件筛选(年龄、体型、性别等)
2.3 领养申请流程
完整的线上领养工作流:
- 用户提交申请(含家庭环境说明)
- 管理员初审(3个工作日内)
- 线下见面确认(系统预约)
- 签订电子协议
- 完成领养(宠物状态变更)
3. 数据库设计与优化
3.1 主要表结构
sql复制CREATE TABLE `pet` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL COMMENT '宠物名称',
`category_id` int NOT NULL COMMENT '分类ID',
`age` tinyint unsigned DEFAULT '0' COMMENT '年龄(月)',
`status` tinyint DEFAULT '0' COMMENT '0-待领养 1-已领养',
`cover_image` varchar(255) DEFAULT NULL COMMENT '封面图URL',
`detail` text COMMENT '详情描述',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_category_status` (`category_id`,`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
3.2 MySQL8.0特性应用
- 使用窗口函数实现领养排行榜:
sql复制SELECT
user_id,
COUNT(*) AS adopt_count,
RANK() OVER(ORDER BY COUNT(*) DESC) AS rank_no
FROM adoption_record
GROUP BY user_id;
- 利用JSON字段存储宠物动态属性:
sql复制ALTER TABLE pet ADD COLUMN attributes JSON DEFAULT NULL;
UPDATE pet SET attributes = JSON_SET('{}', '$.vaccine', true, '$.sterilization', false);
- 使用CTE(Common Table Expression)优化复杂查询
4. 前后端交互关键实现
4.1 API设计规范
遵循RESTful风格:
- GET /api/pets - 获取宠物列表(分页)
- POST /api/adoption - 提交领养申请
- PUT /api/pets/{id}/status - 更新宠物状态
使用Swagger3生成接口文档,通过Knife4j增强UI:
java复制@Configuration
@EnableOpenApi
public class SwaggerConfig {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.OAS_30)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.adoption"))
.paths(PathSelectors.any())
.build();
}
}
4.2 Vue3前端工程化实践
- 使用Vite作为构建工具,相比Webpack启动速度快10倍
- 按需引入Element Plus组件:
javascript复制// vite.config.js
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
export default defineConfig({
plugins: [
AutoImport({
resolvers: [ElementPlusResolver()],
}),
Components({
resolvers: [ElementPlusResolver()],
}),
]
})
- 使用Pinia进行状态管理,替代Vuex:
javascript复制// stores/adoption.js
export const useAdoptionStore = defineStore('adoption', {
state: () => ({
applications: []
}),
actions: {
async fetchApplications() {
this.applications = await api.getAdoptionList()
}
}
})
5. 部署与性能优化
5.1 多环境配置
SpringBoot支持profile区分环境:
yaml复制# application-dev.yml
server:
port: 8080
datasource:
url: jdbc:mysql://localhost:3306/adoption_dev?useSSL=false
username: devuser
password: dev123
# application-prod.yml
server:
port: 80
datasource:
url: jdbc:mysql://mysql-master:3306/adoption_prod?useSSL=true
username: ${DB_USER}
password: ${DB_PWD}
5.2 缓存策略
- 使用Redis缓存热点数据:
java复制@Cacheable(value = "pet", key = "#id")
public Pet getById(Long id) {
return getById(id);
}
@CacheEvict(value = "pet", key = "#pet.id")
public void updatePet(Pet pet) {
updateById(pet);
}
- 前端使用localStorage缓存用户token和基础数据
5.3 性能监控
- SpringBoot Actuator暴露健康检查端点
- Prometheus + Grafana监控JVM指标
- 使用Logback+ELK收集日志
6. 常见问题解决方案
6.1 MyBatis-Plus主键ID冲突
在分布式环境下,建议使用雪花算法替代自增ID:
java复制@TableId(type = IdType.ASSIGN_ID)
private Long id;
// 配置全局ID生成器
@Bean
public IdentifierGenerator idGenerator() {
return new DefaultIdentifierGenerator();
}
6.2 Vue3响应式丢失问题
解构props会导致响应式丢失,需使用toRefs:
javascript复制const props = defineProps(['petInfo'])
const { petInfo } = toRefs(props)
console.log(petInfo.value) // 保持响应式
6.3 MySQL8.0连接失败
新版本默认使用caching_sha2_password认证,旧客户端可能不支持:
sql复制ALTER USER 'username'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
FLUSH PRIVILEGES;
7. 项目扩展方向
- 增加微信小程序端,使用Uniapp跨平台开发
- 接入支付功能实现领养押金线上支付
- 使用WebSocket实现领养状态实时通知
- 增加宠物健康档案管理模块
- 使用Docker Compose实现一键部署
这个宠物领养系统项目完整展示了现代Java Web开发的技术栈组合,从技术选型到具体实现都采用了当前主流的最佳实践。我在实际开发中发现,合理使用MyBatis-Plus的Lambda查询可以大幅减少SQL编写量,而Vue3的Composition API相比Options API确实更利于逻辑复用。对于初学者来说,建议先重点理解SpringBoot的自动配置原理和Vue3的响应式机制,这两个是项目的核心基础。
