1. 项目概述
这个基于SpringBoot的小型电子交易及推荐系统是一个典型的电商类应用,采用了当前主流的Java技术栈。作为一个完整的毕业设计项目,它涵盖了从用户管理、商品展示到智能推荐等电商核心功能模块。我在实际开发过程中发现,这类系统虽然功能看似简单,但要实现稳定可靠的运行,需要考虑很多技术细节。
系统最大的亮点在于集成了智能推荐功能,这在传统的小型电商系统中并不常见。通过协同过滤和内容推荐算法的结合,能够有效提升用户购物体验和转化率。从技术架构来看,项目采用了SpringBoot+Vue.js的前后端分离模式,这种架构选择既保证了开发效率,又为后续扩展留出了空间。
2. 技术架构解析
2.1 后端技术选型
SpringBoot 2.7.x作为后端框架的核心,提供了完善的依赖管理和自动配置能力。我在项目中特别看重以下几点:
-
嵌入式容器:默认使用Tomcat,省去了传统Java Web应用的部署复杂度。实测在4核8G的服务器上,单个实例可以轻松支撑500+的并发请求。
-
Starter依赖:通过spring-boot-starter-*系列依赖,快速集成各种功能。例如:
xml复制<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> -
配置简化:application.yml文件集中管理所有配置项,支持多环境配置:
yaml复制spring: profiles: active: dev datasource: url: jdbc:mysql://localhost:3306/ecommerce username: root password: 123456
注意:数据库密码等敏感信息建议使用Jasypt等工具加密,不要直接写在配置文件中。
2.2 前端技术栈
Vue3+Element Plus的组合提供了极佳的开发体验:
-
组件化开发:将页面拆分为多个可复用组件,例如商品卡片组件:
vue复制<template> <el-card :body-style="{ padding: '0px' }"> <img :src="product.image" class="image"> <div style="padding: 14px;"> <span>{{ product.name }}</span> <div class="price">¥{{ product.price }}</div> </div> </el-card> </template> -
状态管理:使用Pinia管理全局状态,如购物车数据:
javascript复制export const useCartStore = defineStore('cart', { state: () => ({ items: [] }), actions: { addItem(product) { this.items.push(product) } } })
2.3 数据库设计
系统采用MySQL 8.0作为主数据库,关键表结构设计如下:
-
用户表(users):
sql复制CREATE TABLE `users` ( `id` bigint NOT NULL AUTO_INCREMENT, `username` varchar(50) NOT NULL, `password` varchar(100) NOT NULL, `email` varchar(100) DEFAULT NULL, `phone` varchar(20) DEFAULT NULL, `role` enum('USER','SELLER','ADMIN') DEFAULT 'USER', `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `username_UNIQUE` (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -
商品表(products):
sql复制CREATE TABLE `products` ( `id` bigint NOT NULL AUTO_INCREMENT, `name` varchar(100) NOT NULL, `description` text, `price` decimal(10,2) NOT NULL, `stock` int NOT NULL DEFAULT '0', `category_id` bigint NOT NULL, `seller_id` bigint NOT NULL, `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `fk_category` (`category_id`), KEY `fk_seller` (`seller_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -
订单表(orders):
sql复制CREATE TABLE `orders` ( `id` bigint NOT NULL AUTO_INCREMENT, `user_id` bigint NOT NULL, `total_amount` decimal(10,2) NOT NULL, `status` enum('PENDING','PAID','SHIPPED','COMPLETED','CANCELLED') DEFAULT 'PENDING', `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `fk_user` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
提示:在实际项目中,建议为频繁查询的字段添加适当索引,但也要注意索引过多会影响写入性能。
3. 核心功能实现
3.1 用户认证与授权
系统采用JWT(JSON Web Token)实现无状态认证:
-
登录接口实现:
java复制@PostMapping("/login") public ResponseEntity<AuthResponse> login(@RequestBody LoginRequest request) { User user = userService.authenticate(request.getUsername(), request.getPassword()); String token = Jwts.builder() .setSubject(user.getUsername()) .claim("roles", user.getRoles()) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) .signWith(SignatureAlgorithm.HS512, SECRET_KEY) .compact(); return ResponseEntity.ok(new AuthResponse(token)); } -
权限控制:使用Spring Security配置权限:
java复制@Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() .authorizeRequests() .antMatchers("/api/auth/**").permitAll() .antMatchers("/api/admin/**").hasRole("ADMIN") .antMatchers("/api/seller/**").hasRole("SELLER") .anyRequest().authenticated() .and() .addFilter(new JwtAuthenticationFilter(authenticationManager())) .addFilter(new JwtAuthorizationFilter(authenticationManager())); }
3.2 商品管理模块
商品模块实现了CRUD操作和分类管理:
-
商品服务层:
java复制@Service @Transactional public class ProductServiceImpl implements ProductService { @Autowired private ProductRepository productRepository; @Override public Page<Product> getProductsByCategory(Long categoryId, Pageable pageable) { return productRepository.findByCategoryId(categoryId, pageable); } @Override public Product createProduct(Product product) { // 验证卖家身份 User seller = getCurrentUser(); if(!seller.getRole().equals(Role.SELLER)) { throw new UnauthorizedException("Only sellers can create products"); } product.setSeller(seller); return productRepository.save(product); } } -
商品搜索:集成Elasticsearch实现全文检索:
java复制@Repository public interface ProductSearchRepository extends ElasticsearchRepository<Product, Long> { List<Product> findByNameContainingOrDescriptionContaining(String name, String description); @Query("{\"bool\": {\"must\": [{\"match\": {\"name\": \"?0\"}}]}}") List<Product> searchByName(String name); }
3.3 推荐系统实现
推荐模块是本项目的核心创新点:
-
协同过滤算法:
python复制# 使用Python的Surprise库实现协同过滤 from surprise import Dataset, KNNBasic from surprise.model_selection import train_test_split def train_collaborative_filtering(ratings_data): # 加载数据 reader = Reader(rating_scale=(1, 5)) data = Dataset.load_from_df(ratings_data[['user_id', 'product_id', 'rating']], reader) # 划分训练测试集 trainset, testset = train_test_split(data, test_size=0.25) # 使用KNN算法 algo = KNNBasic(k=40, sim_options={'name': 'cosine', 'user_based': False}) algo.fit(trainset) return algo -
SpringBoot集成Python模型:
java复制@Service public class RecommendationService { public List<Product> getRecommendations(Long userId) { // 调用Python服务获取推荐结果 String pythonServiceUrl = "http://localhost:5000/recommend?user_id=" + userId; RestTemplate restTemplate = new RestTemplate(); Long[] productIds = restTemplate.getForObject(pythonServiceUrl, Long[].class); return productRepository.findAllById(Arrays.asList(productIds)); } } -
混合推荐策略:
java复制public List<Product> getHybridRecommendations(Long userId) { // 获取协同过滤推荐 List<Product> cfRecommendations = getCFRecommendations(userId); // 获取基于内容的推荐 List<Product> cbRecommendations = getContentBasedRecommendations(userId); // 合并结果并去重 List<Product> allRecommendations = new ArrayList<>(); allRecommendations.addAll(cfRecommendations); allRecommendations.addAll(cbRecommendations); // 按推荐分数排序 return allRecommendations.stream() .distinct() .sorted(Comparator.comparingDouble(Product::getRecommendationScore).reversed()) .limit(10) .collect(Collectors.toList()); }
4. 系统部署与优化
4.1 部署方案
项目采用Docker容器化部署,极大简化了环境配置:
-
Dockerfile示例:
dockerfile复制FROM openjdk:11-jre-slim WORKDIR /app COPY target/ecommerce-0.0.1-SNAPSHOT.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"] -
docker-compose.yml:
yaml复制version: '3' services: db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: ecommerce ports: - "3306:3306" volumes: - mysql_data:/var/lib/mysql redis: image: redis:6.0 ports: - "6379:6379" app: build: . ports: - "8080:8080" depends_on: - db - redis volumes: mysql_data:
4.2 性能优化技巧
-
缓存策略:
java复制@Cacheable(value = "products", key = "#productId") public Product getProductById(Long productId) { return productRepository.findById(productId) .orElseThrow(() -> new ResourceNotFoundException("Product not found")); } @CacheEvict(value = "products", key = "#product.id") public Product updateProduct(Product product) { return productRepository.save(product); } -
数据库连接池配置:
yaml复制spring: datasource: hikari: maximum-pool-size: 20 minimum-idle: 5 idle-timeout: 30000 max-lifetime: 1800000 connection-timeout: 30000 -
异步处理:使用@Async提高响应速度
java复制@Async public void sendOrderConfirmationEmail(Order order) { // 发送邮件的耗时操作 emailService.send(order.getUser().getEmail(), "订单确认", "您的订单#" + order.getId() + "已创建"); }
5. 常见问题与解决方案
5.1 跨域问题
前后端分离项目常见的跨域问题解决方案:
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.allowedHeaders("*")
.maxAge(3600);
}
}
5.2 事务管理
Spring事务的常见坑点及解决方案:
java复制@Service
public class OrderServiceImpl implements OrderService {
@Transactional
public Order createOrder(OrderRequest request) {
// 1. 扣减库存
productService.reduceStock(request.getProductId(), request.getQuantity());
// 2. 创建订单
Order order = new Order();
// ...设置订单属性
orderRepository.save(order);
// 3. 记录日志
logService.logOrderCreation(order);
return order;
}
}
重要提示:默认情况下,Spring的事务只在遇到RuntimeException时才会回滚。如果需要检查异常也触发回滚,需要使用@Transactional(rollbackFor = Exception.class)
5.3 性能监控
集成Spring Boot Actuator进行系统监控:
yaml复制management:
endpoints:
web:
exposure:
include: health,info,metrics,prometheus
endpoint:
health:
show-details: always
prometheus:
enabled: true
配合Grafana可以构建漂亮的监控面板,实时监控系统各项指标。
6. 项目扩展方向
在实际开发中,我发现这个系统还有几个值得深入优化的方向:
-
支付系统集成:目前系统只模拟了支付流程,可以接入支付宝、微信支付等真实支付渠道。需要注意支付结果异步通知的处理和安全验证。
-
分布式架构改造:随着业务增长,可以将单体应用拆分为微服务,使用Spring Cloud Alibaba组件:
- Nacos:服务注册与发现
- Sentinel:流量控制
- Seata:分布式事务
-
推荐算法优化:当前推荐系统相对简单,可以考虑:
- 引入深度学习模型如Wide & Deep
- 实现实时推荐,利用Flink处理用户实时行为数据
- 增加A/B测试框架,评估不同算法的效果
-
移动端体验优化:虽然系统已经响应式设计,但可以开发专门的移动应用:
- 使用Flutter开发跨平台应用
- 实现推送通知功能
- 优化移动端支付流程
这个项目从技术选型到实现,涵盖了现代Java Web开发的多个重要方面。通过实际开发,我深刻体会到SpringBoot的便利性以及前后端分离架构的优势。特别是在集成推荐系统时,Python和Java的混合使用展现了技术栈组合的灵活性。