1. 项目概述与技术栈选型
宠物咖啡馆平台是一个典型的Java Web全栈项目,采用前后端分离架构。这个系统融合了宠物领养与咖啡餐饮的双重业务场景,为爱宠人士提供一个线上社交与线下体验相结合的服务平台。
技术栈选择上,后端采用SpringBoot 2.x框架,这是当前Java企业级开发的事实标准。SpringBoot的自动配置特性大幅简化了传统SSM框架的XML配置工作,其内嵌Tomcat容器也让部署变得异常简单。前端选用Vue 3组合式API开发,相比Options API更灵活的逻辑复用能力,配合Vite构建工具实现秒级热更新。持久层使用MyBatis-Plus 3.x,这个增强工具在MyBatis基础上提供了强大的CRUD操作封装,特别是其Lambda表达式查询方式,让代码既简洁又类型安全。数据库采用MySQL 8.0,充分利用其窗口函数、CTE表达式等高级特性。
提示:技术栈版本匹配非常重要。SpringBoot 2.7.x需要JDK 17+支持,而Vue 3推荐使用Node.js 16+环境。建议在项目初始化时就通过
.nvmrc和maven-enforcer-plugin锁定版本,避免后续兼容性问题。
2. 系统架构设计与模块划分
2.1 后端工程结构
标准的Maven多模块设计:
code复制pet-cafe
├── pet-cafe-common // 公共模块
│ ├── constant // 枚举常量
│ ├── exception // 异常处理
│ └── utils // 工具类
├── pet-cafe-dao // 数据访问层
│ ├── entity // 实体类
│ ├── mapper // MyBatis接口
│ └── service // 服务接口
├── pet-cafe-biz // 业务逻辑层
│ ├── controller // REST API
│ ├── dto // 数据传输对象
│ └── vo // 视图对象
└── pet-cafe-admin // 管理后台接口
2.2 前端工程结构
基于Vue 3的模块化设计:
code复制src
├── api // 接口定义
├── assets // 静态资源
├── components // 公共组件
│ ├── cafe // 咖啡馆相关
│ └── pet // 宠物相关
├── composables // 组合式函数
├── router // 路由配置
├── stores // Pinia状态管理
└── views // 页面组件
2.3 数据库设计要点
核心表包括:
pet_info:宠物基本信息表,包含品种、年龄、健康状态等字段cafe_shop:咖啡馆门店表,记录地理位置、营业时间等user_account:用户账户体系,采用RBAC权限模型reservation:预约记录表,关联用户、宠物和咖啡馆
注意:MySQL 8.0建议使用
utf8mb4_0900_ai_ci排序规则,完整支持emoji和生僻字存储。对于宠物描述等大文本字段,使用TEXT类型并配合@Column注解限制长度。
3. 核心功能实现细节
3.1 宠物信息管理模块
采用MyBatis-Plus的动态表名处理器,实现分表存储不同种类宠物数据:
java复制public class PetTableNameHandler implements ITableNameHandler {
@Override
public String dynamicTableName(String sql, String tableName) {
PetType type = PetContextHolder.getPetType();
return "pet_" + type.name().toLowerCase();
}
}
前端使用Vue 3的<script setup>语法实现响应式表单:
vue复制<script setup>
const formState = reactive({
petName: '',
breed: undefined,
birthday: dayjs().format('YYYY-MM-DD')
})
const rules = {
petName: [{ required: true, trigger: 'blur' }]
}
</script>
3.2 咖啡馆预约系统
处理高并发预约的分布式锁实现:
java复制@Transactional
public boolean makeReservation(Long cafeId, LocalDateTime time) {
String lockKey = "reserve:" + cafeId + ":" + time.format(FORMATTER);
try {
Boolean locked = redisTemplate.opsForValue()
.setIfAbsent(lockKey, "1", 30, TimeUnit.SECONDS);
if (Boolean.TRUE.equals(locked)) {
// 执行库存检查与预约逻辑
}
} finally {
redisTemplate.delete(lockKey);
}
}
3.3 用户认证与授权
JWT令牌增强方案:
java复制public class JwtTokenEnhancer implements TokenEnhancer {
@Override
public OAuth2AccessToken enhance(OAuth2AccessToken accessToken,
OAuth2Authentication authentication) {
Map<String, Object> info = new HashMap<>();
info.put("organization", authentication.getName());
((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(info);
return accessToken;
}
}
前端Axios拦截器处理401状态:
javascript复制axios.interceptors.response.use(response => {
return response
}, error => {
if (error.response.status === 401) {
store.dispatch('user/logout')
router.push(`/login?redirect=${route.fullPath}`)
}
return Promise.reject(error)
})
4. 开发环境配置与优化技巧
4.1 本地开发环境搭建
推荐使用Docker Compose一键启动依赖服务:
yaml复制version: '3'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root
ports:
- "3306:3306"
volumes:
- ./mysql-data:/var/lib/mysql
redis:
image: redis:alpine
ports:
- "6379:6379"
4.2 性能优化实践
- MyBatis-Plus二级缓存配置:
yaml复制mybatis-plus:
configuration:
cache-enabled: true
local-cache-scope: session
- Vue 3组件懒加载:
javascript复制const PetList = defineAsyncComponent(() =>
import('./views/PetList.vue')
)
- MySQL连接池优化:
properties复制spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.idle-timeout=600000
4.3 常见问题排查
- Vue 3响应式丢失问题:
javascript复制// 错误做法
state.list = [...newList]
// 正确做法
state.list = reactive([...newList])
- MyBatis-Plus分页查询失效:
java复制// 需要先配置分页拦截器
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
- SpringBoot跨域配置注意项:
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOriginPatterns("*")
.allowCredentials(true)
.allowedMethods("*")
.maxAge(3600);
}
}
5. 项目部署与监控方案
5.1 生产环境打包
前端Vite生产构建命令:
bash复制vite build --mode production --outDir dist
SpringBoot打包为可执行JAR:
bash复制mvn clean package -DskipTests
5.2 Docker容器化部署
编写多阶段构建Dockerfile:
dockerfile复制# 构建阶段
FROM maven:3.8.6-openjdk-17 AS build
COPY . .
RUN mvn package
# 运行阶段
FROM openjdk:17-jdk-slim
COPY --from=build /target/*.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
5.3 监控与日志
- SpringBoot Actuator健康检查:
yaml复制management:
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: always
- 日志收集方案:
xml复制<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>7.2</version>
</dependency>
- Prometheus监控指标:
java复制@Bean
MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {
return registry -> registry.config().commonTags(
"application", "pet-cafe"
);
}
6. 项目扩展与二次开发建议
-
微信小程序集成:通过
uniapp编译为多端应用,后端增加/mini-api路由组 -
宠物健康追踪:接入IoT设备数据,使用WebSocket实时推送健康指标
-
智能推荐算法:基于用户行为数据,实现协同过滤推荐
-
多语言支持:前端使用vue-i18n,后端通过Accept-Language头处理
-
支付系统集成:对接支付宝/微信支付SDK,实现预约押金功能
在真实项目开发中,我特别建议在初期就建立完整的API文档体系。可以使用Swagger UI配合SpringDoc OpenAPI实现实时文档同步。对于Vue 3项目,推荐使用TypeScript强化类型检查,这能在编译阶段就发现大部分类型错误。数据库迁移建议采用Flyway,保证各环境数据结构一致。
