1. 项目概述
作为一名有18年开发经验的Java全栈工程师,我最近指导了一个高校汉服租赁网站系统的毕业设计项目。这个项目采用SpringBoot框架作为核心,整合了当前流行的技术栈,为高校师生提供了一个便捷的汉服租赁平台。
汉服文化近年来在年轻人中越来越受欢迎,特别是在高校校园里。但很多学生只是偶尔需要穿着汉服参加活动,购买一套汉服不仅成本高,而且使用频率低。这个系统正是为了解决这个问题而设计的,让同学们可以方便地租赁汉服,既节省开支,又能体验传统文化。
2. 技术选型与架构设计
2.1 技术栈组成
我们选择了以下技术栈来构建这个系统:
- 后端框架:SpringBoot 2.7.x
- Web框架:Spring MVC
- 持久层:MyBatis 3.5.x
- 数据库:MySQL 8.0
- 缓存:Redis 6.x
- 构建工具:Maven 3.8.x
- 版本控制:Git
- 前端框架:Vue.js 3.x
选择这些技术主要基于以下几个考虑:
- SpringBoot的自动配置和快速启动特性可以显著提高开发效率
- MyBatis相比Hibernate更灵活,适合需要精细控制SQL的场景
- MySQL作为成熟的关系型数据库,能满足系统数据存储需求
- Redis可以有效缓解高并发下的数据库压力
2.2 系统架构设计
系统采用微服务架构,主要分为以下几个服务模块:
- 用户服务:处理用户注册、登录、权限管理等
- 商品服务:管理汉服商品信息、分类、库存等
- 订单服务:处理订单创建、状态变更等
- 支付服务:对接第三方支付平台
- 内容服务:管理新闻公告、帮助文档等
每个服务都是独立的SpringBoot应用,通过RESTful API进行通信。这种设计提高了系统的可扩展性和可维护性。
3. 核心功能实现
3.1 用户管理模块
用户管理是系统的基础模块,我们实现了以下功能:
- 用户注册:支持邮箱和手机号注册,采用BCrypt加密存储密码
- 登录认证:基于JWT实现无状态认证
- 权限控制:使用Spring Security实现基于角色的访问控制
java复制// 用户注册示例代码
@PostMapping("/register")
public ResponseEntity<?> registerUser(@RequestBody UserDTO userDTO) {
if (userRepository.existsByUsername(userDTO.getUsername())) {
return ResponseEntity.badRequest().body("用户名已存在");
}
User user = new User();
user.setUsername(userDTO.getUsername());
user.setPassword(passwordEncoder.encode(userDTO.getPassword()));
user.setEmail(userDTO.getEmail());
user.setPhone(userDTO.getPhone());
user.setRole(Role.USER);
userRepository.save(user);
return ResponseEntity.ok("注册成功");
}
3.2 商品管理模块
商品管理模块主要包括:
- 商品CRUD:管理员可以添加、修改、删除商品信息
- 商品分类:支持多级分类,方便用户浏览
- 图片上传:使用阿里云OSS存储商品图片
注意:商品删除应采用逻辑删除而非物理删除,避免影响历史订单数据
3.3 订单处理流程
订单处理是系统的核心业务,流程如下:
- 用户选择商品并加入购物车
- 提交订单时检查库存
- 生成订单并跳转支付
- 支付成功后更新订单状态
- 管理员处理订单(发货、完成等)
java复制// 订单创建逻辑
@Transactional
public Order createOrder(OrderDTO orderDTO, Long userId) {
// 检查库存
Product product = productRepository.findById(orderDTO.getProductId())
.orElseThrow(() -> new ResourceNotFoundException("商品不存在"));
if (product.getStock() < orderDTO.getQuantity()) {
throw new BusinessException("库存不足");
}
// 扣减库存
product.setStock(product.getStock() - orderDTO.getQuantity());
productRepository.save(product);
// 创建订单
Order order = new Order();
order.setUserId(userId);
order.setProductId(orderDTO.getProductId());
order.setQuantity(orderDTO.getQuantity());
order.setTotalPrice(product.getPrice() * orderDTO.getQuantity());
order.setStatus(OrderStatus.PENDING);
return orderRepository.save(order);
}
4. 数据库设计与优化
4.1 数据库表结构
系统主要包含以下表:
- 用户表(user):存储用户基本信息
- 商品表(product):存储汉服商品信息
- 分类表(category):商品分类信息
- 订单表(order):订单基本信息
- 支付记录表(payment_record):支付相关信息
4.2 索引优化
为提高查询性能,我们在以下字段上建立了索引:
- 用户表的username、email、phone字段
- 商品表的name、category_id字段
- 订单表的user_id、status字段
sql复制-- 创建索引示例
CREATE INDEX idx_product_name ON product(name);
CREATE INDEX idx_order_user ON order(user_id);
4.3 缓存策略
我们使用Redis缓存以下数据:
- 热门商品信息
- 用户会话信息
- 商品分类树
缓存过期时间设置:
- 商品信息:1小时
- 用户会话:7天
- 分类数据:24小时
5. 系统安全设计
5.1 认证与授权
系统采用JWT进行认证,结合Spring Security实现授权控制。主要安全措施包括:
- 密码加密存储(BCrypt)
- CSRF防护
- XSS防护
- SQL注入防护
5.2 敏感数据保护
- 用户密码加密存储
- 支付信息不直接存储
- 日志脱敏处理
6. 部署与运维
6.1 容器化部署
我们使用Docker进行容器化部署,主要包含以下容器:
- 应用服务容器
- MySQL容器
- Redis容器
- Nginx容器
dockerfile复制# SpringBoot应用Dockerfile示例
FROM openjdk:11-jre
COPY target/hanfu-rental-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
6.2 监控与日志
- 使用Spring Boot Actuator暴露健康检查端点
- 集成Prometheus监控
- ELK收集和分析日志
7. 性能优化实践
7.1 数据库优化
- 合理设计索引
- 使用连接池(HikariCP)
- 读写分离(主从复制)
7.2 应用层优化
- 使用二级缓存(Redis + MyBatis缓存)
- 异步处理非核心流程
- 接口限流(Guava RateLimiter)
7.3 前端优化
- CDN加速静态资源
- 图片懒加载
- 组件按需加载
8. 常见问题与解决方案
8.1 并发问题
问题:高并发下库存超卖
解决方案:使用乐观锁或Redis分布式锁
java复制// 乐观锁实现
@Transactional
public boolean decreaseStock(Long productId, int quantity) {
Product product = productRepository.findById(productId)
.orElseThrow(() -> new ResourceNotFoundException("商品不存在"));
if (product.getStock() < quantity) {
return false;
}
int affectedRows = productRepository.decreaseStock(productId, quantity, product.getVersion());
return affectedRows > 0;
}
8.2 支付对接问题
问题:支付结果异步通知处理
解决方案:保证接口幂等性,记录支付流水
8.3 缓存一致性问题
问题:数据库更新后缓存未同步
解决方案:采用Cache Aside Pattern模式
9. 项目总结与展望
这个高校汉服租赁网站系统项目从需求分析到最终部署历时3个月,期间遇到了不少技术挑战,但也收获了很多宝贵的经验。系统目前已经具备了完整的租赁功能,能够满足高校师生的基本需求。
未来可以考虑的改进方向包括:
- 引入推荐算法,根据用户历史租赁记录推荐汉服
- 增加社交功能,让用户可以分享汉服穿搭
- 支持汉服定制服务
在实际开发过程中,我深刻体会到良好的系统设计和规范的编码习惯的重要性。特别是在处理并发和分布式事务时,需要仔细考虑各种边界情况。