1. 项目概述与技术栈解析
这个基于SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0的旅游网站系统,是一个典型的现代化全栈Web应用。我在实际开发中发现,这种技术组合特别适合需要快速迭代的中小型项目。前端Vue3的组合式API配合后端的SpringBoot,能实现极高的开发效率。
系统采用前后端分离架构,后端提供RESTful API接口,前端通过axios进行数据交互。这种架构的最大优势在于前后端可以并行开发,而且前端可以灵活适配多种终端(Web、App、小程序等)。我去年参与的一个景区票务系统改造项目,就是采用类似架构,上线后维护成本降低了40%。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心模块设计与实现
2.1 用户认证与权限控制
采用JWT+Spring Security的方案实现认证授权。这里有个关键细节:JWT的密钥长度建议至少512位,过期时间设置为2小时较合适。我在配置文件中是这样定义的:
yaml复制jwt:
secret: "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0u1v2w3x4y5z6"
expiration: 7200 # 秒
权限控制采用RBAC模型,数据库设计了5张核心表:
- 用户表(user)
- 角色表(role)
- 权限表(permission)
- 用户角色关联表(user_role)
- 角色权限关联表(role_permission)
2.2 旅游产品管理模块
这个模块采用了MyBatis-Plus的动态SQL特性,可以灵活构建查询条件。比如搜索旅游产品时:
java复制public Page<Product> searchProducts(ProductQuery query) {
return lambdaQuery()
.like(StringUtils.isNotBlank(query.getKeyword()), Product::getName, query.getKeyword())
.eq(query.getCategoryId() != null, Product::getCategoryId, query.getCategoryId())
.between(query.getMinPrice() != null && query.getMaxPrice() != null,
Product::getPrice, query.getMinPrice(), query.getMaxPrice())
.page(new Page<>(query.getPageNum(), query.getPageSize()));
}
产品详情页使用了Vue3的Suspense组件实现异步加载,大幅提升了首屏加载速度。
3. 关键技术实现细节
3.1 高性能图片处理
旅游网站图片量大,我们实现了以下优化:
- 使用阿里云OSS存储图片
- 前端通过WebP格式自动转换
- 实现懒加载和渐进式加载
图片上传接口采用分块上传,核心代码如下:
java复制@PostMapping("/upload")
public Result upload(@RequestParam MultipartFile file) {
String fileName = UUID.randomUUID() + "." + FileUtil.extName(file.getOriginalFilename());
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
try {
ossClient.putObject(bucketName, fileName, file.getInputStream());
return Result.success(domain + "/" + fileName);
} finally {
ossClient.shutdown();
}
}
3.2 订单支付流程
支付模块集成了支付宝和微信支付双渠道。关键点在于:
- 使用分布式事务保证数据一致性
- 实现支付结果异步通知
- 订单状态机设计
状态机采用枚举实现:
java复制public enum OrderStatus {
UNPAID(1, "待支付"),
PAID(2, "已支付"),
COMPLETED(3, "已完成"),
CANCELLED(4, "已取消");
// 状态转换校验逻辑
public static boolean canTransfer(OrderStatus from, OrderStatus to) {
// 具体校验规则...
}
}
4. 性能优化实践
4.1 数据库优化
MySQL8.0使用了以下优化手段:
- 所有表使用InnoDB引擎
- 建立合适的索引(特别是订单表的user_id和product_id)
- 配置了合适的缓冲池大小
sql复制-- 示例索引
CREATE INDEX idx_user_product ON orders(user_id, product_id);
4.2 缓存策略
采用Redis多级缓存:
- 一级缓存:MyBatis-Plus自带SQL缓存
- 二级缓存:Redis缓存热点数据
- 本地缓存:Caffeine缓存配置信息
缓存更新策略采用Cache Aside Pattern:
- 先更新数据库
- 再删除缓存
- 下次查询时重新加载
5. 部署与监控
5.1 容器化部署
使用Docker Compose编排服务:
yaml复制version: '3'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root
ports:
- "3306:3306"
redis:
image: redis:6
ports:
- "6379:6379"
backend:
build: ./backend
ports:
- "8080:8080"
frontend:
build: ./frontend
ports:
- "80:80"
5.2 监控方案
- Spring Boot Actuator暴露健康检查
- Prometheus采集指标
- Grafana可视化监控
6. 开发中的经验教训
- 跨域问题:开发环境要配置正确的CORS,生产环境建议通过Nginx解决
- 日期处理:统一使用Java8的LocalDateTime,前端使用day.js
- 接口文档:使用Swagger UI但要注意生产环境要关闭
- 日志规范:采用SLF4J+Logback,日志文件按天分割
7. 扩展功能建议
根据实际项目经验,可以考虑增加:
- 推荐系统(基于用户行为)
- 智能客服(集成第三方API)
- 数据大屏(使用ECharts)
- 微信小程序版本
这个项目代码结构清晰,文档完整,包含:
- 数据库设计文档
- API接口文档
- 部署手册
- 开发规范
我在实际部署时发现,内存建议至少4G,MySQL要配置足够的innodb_buffer_pool_size(建议为物理内存的70%)。对于高并发场景,可以考虑引入Elasticsearch优化搜索性能。
